题目实质是判断是否为连通的无回路的图。用简单并查集做,只是要注意以下三点:
1、读入过程中,合并集合的时候,如果,当前读入的两个元素属于同一个集合,那么肯定是No~;
2、不要忘了最后要判断所有的点都要是连通的哦~不能有孤立的;(这个很关键,之前没考虑到这点一直WA)
3、读入只有0 0的时候,要输出Yes。。。
有人说要考虑点数是否是边数+1来判断回路,其实是不正确的。1 1 0 0也要输出Yes。
AC代码:
#include<stdio.h>
#define NUM 100005
int set[NUM];
int visit[NUM];
void init()
{
int i;
for(i=0;i<=NUM;i++){
set[i]=i;
visit[i]=0;
}
}
int find(int x)
{
int r=x;
while(set[r]!=r)
r=set[r];
return r;
}
void merge(int a, int b)
{
int x=find(a);
int y=find(b);
set[x]=y;
}
int main()
{
int a,b,i,flag,vex,count;
//freopen("C:\\Documents and Settings\\Administrator\\桌面\\input.txt","r",stdin);
init();
flag=1;
count=0;
vex=0;
while(scanf(" %d%d",&a,&b)!=EOF&&a!=-1&&b!=-1){
if(visit[a]==0){
vex++;
visit[a]=1;
}
if(visit[b]==0){
vex++;
visit[b]=1;
}
count++;
if(find(a)==find(b)&&a!=0&&b!=0&&a!=b){
flag=0;
} else {
merge(a,b);
}
if(a==0&&b==0){
int cnt=0;
for(i=1;i<NUM;i++){
if(visit[i]==1&&set[i]==i)
cnt++;
if(cnt>1)
flag=0;
}
// if(vex==count&&vex==1)
// flag=0;
if(flag==0)
printf("No\n");
else printf("Yes\n");
init();
flag=1;
vex=0;
count=0;
}
}
return 0;
}