7-1 顶点的度 (15 分)
顶点的图。给定一个有向图,输出各顶点的出度和入度。
输入格式:
输入文件中包含多个测试数据,每个测试数据描述了一个无权有向图。每个测试数据的第一行为两个正整数n 和m,1 ≤ n ≤ 100,1 ≤ m ≤ 500,分别表示该有向图的顶点数目和边数,顶点的序号从1 开始计起。接下来有m 行,每行为两个正整数,用空格隔开,分别表示一条边的起点和终点。每条边出现一次且仅一次,图中不存在自身环和重边。
输出格式:
对输入文件中的每个有向图,输出两行:第1 行为n 个正整数,表示每个顶点的出度;第2行也为n 个正整数,表示每个顶点的入度。每个数之后输出一个空格。
输入样例:
7 9 1 2 2 3 2 5 2 6 3 5 4 3 5 2 5 4 6 7
结尾无空行
输出样例:
1. 1 3 1 1 2 1 0 2. 0 2 2 1 2 1 1
结尾无空行
#include<iostream> #include<stdlib.h> using namespace std; #define max 100 typedef struct gnode *grap; struct gnode{ int n; int m; int g[max][max]; }; grap create(void){ grap p=(gnode *)malloc(sizeof(struct gnode)); p->n=0; p->m=0; return p; } void insert(grap mgrap,int a,int b){ mgrap->g[a][b]=1; } void output(grap mgrap){ int i,j,first=1; for(i=1;i<=mgrap->n;i++){ int out=0; for(j=1;j<=mgrap->n;j++){ if(mgrap->g[i][j]) out++; } if(first==1){ printf("%d",out); first=0; }else printf(" %d",out); } printf("\n"); first=1; for(i=1;i<=mgrap->n;i++){ int in=0; for(j=1;j<=mgrap->n;j++){ if(mgrap->g[j][i]) in++; } if(first==1){ printf("%d",in); first=0; }else{ printf(" %d",in); } } } void reset(grap mgrap){ int i,j; for(i=1;i<=mgrap->n;i++){ for(j=1;j<=mgrap->n;j++){ mgrap->g[i][j]=0; } } mgrap->n=0; mgrap->m=0; } int main(){ int m,n,i,j,a,b; grap mgrap=create(); while(1){ scanf("%d %d",&n,&m); if(n==0&&m==0)break; else{ mgrap->n=n; mgrap->m=m; reset(mgrap); mgrap->n=n; mgrap->m=m; for(i=1;i<=m;i++){ scanf("%d%d",&a,&b); insert(mgrap,a,b); } output(mgrap); reset(mgrap); } printf("\n"); } return 0; }