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 3 1 1 2 1 0
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;
}