邻接矩阵存储有向图

时间:2022-07-02 22:41:46

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

输入描述:

输入文件中包含多个测试数据,每个测试数据描述了一个无权有向图。每个测试数据的第一行为两个正整数n和m,1<=n<=100,1<=m<=500,分别表示该有向图的定点数目和边数,顶点的序号从1开始计起。接下来有m行,每行为两个正整数,用空格隔开,分别表示一条边的起点和终点。每条边出现一次且仅一次,图中不存在自身环和重边。输入文件最后一行为0 0,表示输入输出结束。

输出描述:

对输入文件中的每个有向图,输出两行:第一行为n个正整数,表示每个定点的出度;第二行也为n个正整数,表示每个定点的入度。每两个正整数之间用一个空格隔开,每行的最后一个正整数之后没有空格。

样例输入:

    7       9

     1        2

     2        3

     2        5

     2        6

     3        5

     4        3

     5        2

     5        4

     6        7

     0        0

样例输出:

   1    3    1     1     2      1     0

   0    2    2    1     2      1      1

#include<string.h> 
#include<stdio.h>
#define MAXN 100 //顶点个数最大值
int Edge[MAXN][MAXN]; //邻接矩阵
int main(){
int i,j; //循环变量
int n,m; //顶点的个数、边数
int u,v; //边的起点与终点
int od,id; //顶点的出度与入度
while(1)
{
scanf("%d%d",&n,&m); //读入定点个数n和边数m
if(n==0&&m==0) break; //输入数据结束
memset(Edge,0,sizeof(Edge));
for(i=1;i<=m;i++)
{
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;
}