用邻接矩阵存储有向图,并输出各顶点的出入和入度。

时间:2021-09-17 22:41:23

输入描述:

输入文件中包含多个测试数据,每个测试数据描述了一个无权有向图。每个测试数据的第一

行为两个正整数n m1 n 1001 m 500,分别表示该有向图的顶点数目和边数,顶点的

序号从1 开始计起。接下来有m 行,每行为两个正整数,用空格隔开,分别表示一条边的起点和

终点。每条边出现一次且仅一次,图中不存在自身环和重边。输入文件最后一行为0 0,表示输入

数据结束。

输出描述:

对输入文件中的每个有向图,输出两行:第1 行为n 个正整数,表示每个顶点的出度;第2

行也为n 个正整数,表示每个顶点的入度。每两个正整数之间用一个空格隔开,每行的最后一个

正整数之后没有空格。

#include <stdio.h>
#include <string.h>
#define MAX 100 //顶点的最大个数


int Edge[MAX][MAX];//邻接矩阵

int main()
{
    
    int i,j;//循环变量
    int n,m;//顶点个数,边数
    int u,v;//边的起点和终点
    int od,id;//顶点的出度和入度
    while(1)
    {
        printf("请输入顶点个数和边数\n");
        scanf("%d %d",&n,&m);//读入顶点个数n和边数m
        if(n == 0 && m == 0)
        {
            break;
        }
        memset(Edge,0,sizeof(Edge));
        for(i = 1; i <= m; i++)
        {
            printf("请输入边的起点和终点\n");
            scanf("%d %d",&u,&v);//读入边的起点和终点
            Edge[u - 1] [v - 1] = 1;//构造邻接矩阵
            
        }
        
        for(i = 0; i < n; i++)//求各顶点的入度
        {
            od = 0;
            for(j = 0; j < n; j++)
            {
                od += Edge[i][j];//累加到第i列
            }
            if(i == 0)
            {
                printf("%d ",od);
            }
            else
            {
                printf("%d ",od);
            }
        }
        printf("\n");
        
        
        for(i = 0; i < n; i++)//求各顶点的入度
        {
            id = 0;
            for(j = 0; j < n; j++)
            {
                id += Edge[j][i];//累加到第i列
            }
            if(i == 0)
            {
                printf("%d ",id);
            }
            else
            {
                printf("%d ",id);
            }
        }
        
        printf("\n");
    }
    return 0;
}