这虽然是个并查集水题,但是要注意的地方还真的比较多。
首先要所有的房间都连在一个并查集上,然后就是不能存在环......如此应该可以水过.....
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; struct node{int x;int y;} no[200002]; int f[200002],vis[200002]; int find(int x) { return f[x]==x?x:f[x]=find(f[x]); } int main() { int i,a,b,aa,bb,maxx=0,num=0; //memset(vis,0,sizeof(vis)); while(~scanf("%d%d",&a,&b)) { //scanf("%d%d",&a,&b); if(a==-1&&b==-1) break; else if(a==0&&b==0) { if(num==0) { printf("Yes "); continue; } //getchar(); int flag=0; for(i=0;i<=100005;i++) f[i]=i; for(i=0;i<num;i++) { aa=find(no[i].x); bb=find(no[i].y); if(aa==bb) { flag=1; break; } else f[aa]=bb; } //int cnt=0; for(int i=0;i<=100005;i++) find(i); int cnt=0; for(int i=0;i<=100005;i++) if(i!=find(i)) { cnt=find(i); break; } for(int i=0;i<=100005;i++) if(i!=find(i)&&cnt!=find(i)) { flag=1; break; } if(!flag) printf("Yes "); else printf("No "); //maxx=0; num=0; //memset(vis,0,sizeof(vis)); } else { no[num].x=a; no[num++].y=b; /*if(maxx<a) maxx=a; if(maxx<b) maxx=b;*/ } } return 0; }