用邻接表存储有向图,并输出各顶点的出入和入度。
输入描述:
输入文件中包含多个测试数据,每个测试数据描述了一个无权有向图。每个测试数据的第一
行为两个正整数n和m,1≤n ≤100,1≤ m ≤500,分别表示该有向图的顶点数目和边数,顶点的
序号从1开始计起。接下来有m行,每行为两个正整数,用空格隔开,分别表示一条边的起点和
终点。每条边出现一次且仅一次,图中不存在自身环和重边。输入文件最后一行为0 0,表示输入
数据结束。
输出描述:
对输入文件中的每个有向图,输出两行:第1行为n个正整数,表示每个顶点的出度;第2
行也为n个正整数,表示每个顶点的入度。每两个正整数之间用一个空格隔开,每行的最后一个
正整数之后没有空格。
样例输入:
7 9
1 2
2 3
2 5
2 6
3 5
4 3
5 2
5 4
6 7
4 7
1 4
2 1
2 2
2 3
2 3
4 2
4 3
输入描述:
输入文件中包含多个测试数据,每个测试数据描述了一个无权有向图。每个测试数据的第一
行为两个正整数n和m,1≤n ≤100,1≤ m ≤500,分别表示该有向图的顶点数目和边数,顶点的
序号从1开始计起。接下来有m行,每行为两个正整数,用空格隔开,分别表示一条边的起点和
终点。每条边出现一次且仅一次,图中不存在自身环和重边。输入文件最后一行为0 0,表示输入
数据结束。
输出描述:
对输入文件中的每个有向图,输出两行:第1行为n个正整数,表示每个顶点的出度;第2
行也为n个正整数,表示每个顶点的入度。每两个正整数之间用一个空格隔开,每行的最后一个
正整数之后没有空格。
样例输入:
7 9
1 2
2 3
2 5
2 6
3 5
4 3
5 2
5 4
6 7
4 7
1 4
2 1
2 2
2 3
2 3
4 2
4 3
0 0
样例输出:
1 3 1 1 2 1 0
0 2 2 1 2 1 1
1 4 0 2
1 2 3 1
#include <stdio.h>
#include<cstring>
#include<stdlib.h>
#define N 505
struct Vertex//边节点
{
int order;
Vertex *next;
};
struct Graph//图结构体
{
struct vertex{
Vertex *p,*q;
}V[N];//顶点数组
int n1,n2;
};
Graph head;
void creat(int n,int m)//创建一个n个顶点,m条边的图
{
head.n1=n,head.n2=m;
for(int i=1;i<=n;i++)
{
head.V[i-1].p=NULL;
head.V[i-1].q=NULL;
}
int v1,v2;
Vertex *f;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&v1,&v2);
f=new Vertex;
f->order=v2-1;
f->next=head.V[v1-1].p;
head.V[v1-1].p=f;
f=new Vertex;
f->order=v1-1;
f->next=head.V[v2-1].q;
head.V[v2-1].q=f;
}
}
void Delete()//删除图
{
Vertex *f;
for(int i=0;i<head.n1;i++)
{
f=head.V[i].p;
while(f!=NULL)
{
head.V[i].p=f->next;
delete f;
f=head.V[i].p;
}
f=head.V[i].q;
while(f!=NULL)
{
head.V[i].q=f->next;
delete f;
f=head.V[i].q;
}
}
}
int main()
{
int m,n;
freopen("in.txt","r",stdin);
while(scanf("%d%d",&n,&m))
{
if(!m&&!n)return 0;
creat(n,m);
int flag=1;
for(int i=0;i<head.n1;i++)//计算出度
{
int t=0;
Vertex *f=head.V[i].p;
while(f!=NULL)
{
f=f->next;
t++;
}
if(flag){flag=0;printf("%d",t);}
else printf(" %d",t);
}
printf("\n");
flag=1;
for(int i=0;i<head.n1;i++)//计算入度
{
int t=0;
Vertex *f=head.V[i].q;
while(f!=NULL)
{
f=f->next;
t++;
}
if(flag){flag=0;printf("%d",t);}
else printf(" %d",t);
}
printf("\n");
Delete();
}
return 0;
}