小希的迷宫 HDU - 1272
#include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N=1e5; int a,b; int p[N+10]; // 标记走过的房间 bool vis[N+10]; int find(int x) { if(p[x]!=x) p[x]=find(p[x]); return p[x]; } void Union(int a,int b) { int pa=find(a); int pb=find(b); if(pa!=pb) p[pb]=pa; } int main() { while(cin>>a>>b) { if(a==-1&&b==-1) break; // a,b 均为 0 时,也要输出 Yes;空树也是树 if(a==0&&b==0) { cout<<"Yes"<<endl; continue; } for(int i=1;i<=N;i++) p[i]=i,vis[i]=0; int maxx=0; bool flag=0; while(a||b) { vis[a]=1; vis[b]=1; //是否成环 if(find(a)==find(b)) flag=1; Union(a,b); // 找出房间编号的最大值 maxx=max(maxx,max(a,b)); cin>>a>>b; } if(flag) cout<<"No"<<endl; else { int cnt=0; // 计算共有几个符合条件的联通集合 for(int i=1;i<=maxx;i++) if(vis[i]&&p[i]==i) cnt++; // 这里可能存在不止一个集合,这样的话 ans 值就大于 1 了,这样就不满足题意了,就该输出 No if(cnt==1) cout<<"Yes"<<endl; else cout<<"No"<<endl; } } return 0; }