题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272
#include<cstdio> #include<cstring> using namespace std; int father[100001]; int find(int x) { if(father[x]!=x) father[x]=find(father[x]); return father[x]; } int main() { int i,max=0,a,b,num=0; bool mark=true; int flag[100001]; memset(flag,0,sizeof(flag)); for(i=0;i<100001;i++) father[i]=i; for(;;) { scanf("%d%d",&a,&b); if(a==-1&&b==-1) break; if(max<a) max=a; if(max<b) max=b; if(a==0&&b==0) { for(i=1;i<=max;i++) { if(father[i]==i&&flag[i]==1)//计算连通分支数 num++; } if(num>1)//森林 mark=false; if(mark==false) printf("No "); else printf("Yes "); memset(flag,0,sizeof(flag)); for(i=0;i<100001;i++) father[i]=i; mark=true; max=num=0; continue; } if(find(a)==find(b))//同一个连通分支 mark=false;//标记 flag[a]=flag[b]=1;//标记房号 a=find(a); b=find(b); father[a]=b;//a指向b } return 0; }