用邻接矩阵存储有向图,并输出各定点的出入和入度
输入描述:
输入文件中包含多个测试数据,每个测试数据描述了一个无权有向图。每个测试数据的第一行为两个正整数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;
}