输入描述:
输入文件中包含多个测试数据,每个测试数据描述了一个无权有向图。每个测试数据的第一
行为两个正整数n 和m,1 ≤ n ≤ 100,1 ≤ 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;
}