6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1
Yes Yes No思路:另类变形的并查集,实际上变化没有多大.只需要每次输入相连的2个房间的时候判断这2个房间是否有相同的父节点就可以了!另外还要判断是否有孤立点。AC代码:#include<stdio.h> #define maxn 100005 int flag,f[maxn],room[maxn]; int find(int x) { if(f[x]!=x) f[x]=find(f[x]); return f[x]; } void make(int x,int y) { x=find(x); y=find(y); if(x!=y) f[x]=y; else //如果有相同的父节点,标记 flag=0; } int main() { int a,b,i,k; while(scanf("%d %d",&a,&b)!=EOF) { if(a==-1&&b==-1)break; if(a==0&&b==0){printf("Yes\n");continue;} for(i=1;i<maxn;i++){f[i]=i;room[i]=0;} room[a]=1;room[b]=1; flag=1; make(a,b); while(scanf("%d %d",&a,&b)!=EOF) { if(a==0&&b==0)break; make(a,b); room[a]=1; room[b]=1; } k=0; if(flag){ for(i=0;i<maxn;i++){ if(room[i]&&f[i]==i) k++; if(k>1){flag=0;break;} } } if(flag)printf("Yes\n"); else printf("No\n"); } return 0; }
原文地址:http://blog.csdn.net/u012313382/article/details/37811107