UVA_10763

这个题目可以把交换生的u->v看做一条有向边,然后用邻接表把所有的边及其反向边存下来,并且保证邻接表中没有重复的边。这时用一个num[]数组来存储该边的数量,并且每出现一条与之相同的正向边num[]的值自加1,每出现一条与之相反的反向边,num[]的值自减1。最后统计邻接表中num的值是否全为0,如果全为0就输出YES,否则就输出NO

另外,之所以选用邻接表,是怕题目中存在国家表示的数字很大(比如500000)的情况,后来发现最大的数字不超过1000,于是便又改用邻接矩阵存边了,这样在插入边时要比邻接表要快得多,代码复杂度也降低了很多。

#include<stdio.h>
#include
<string.h>
int G[1000][1000],n;
int check()
{
int i,j;
for(i=0;i<1000;i++)
for(j=0;j<1000;j++)
if(G[i][j]!=0)
return 0;
return 1;
}
int main()
{
int i,j,u,v;
while(1)
{
scanf(
"%d",&n);
if(n==0)
break;
memset(G,
0,sizeof(G));
for(i=0;i<n;i++)
{
scanf(
"%d%d",&u,&v);
G[u][v]
++;
G[v][u]
--;
}
if(check())
printf(
"YES\n");
else
printf(
"NO\n");
}
return 0;
}


posted on 2011-09-20 19:06  Staginner  阅读(1469)  评论(6编辑  收藏  举报