hdu 1272 小希的迷宮(並查集)
阿新 • • 發佈:2018-12-28
這題只要判斷一下有沒有環,並且要保證只有一個集合。
還有一個坑就是:x==0 y==0, 輸出yes。因為沒有點,也是符合要求的。
我這裡沒有用壓縮路徑,據說這題壓縮路徑會爆棧,如果爆棧的話,find裡面換用迴圈的方式寫就行了。
附上ac程式碼:
#include<iostream> #include<algorithm> #include<cstdio> #include<set> using namespace std; const int Max = 1e5+5; int pre[Max]; void init() { for(int i=0;i<Max;i++) { pre[i]=i; } } int find(int x) { int tmp = x; while(x!=pre[x]) { x=pre[x]; } pre[tmp]=x; return x; } void Union(int x,int y) { int rootx = find(x); int rooty = find(y); if(rootx!=rooty) { pre[rootx]=rooty; } } int main() { int x,y; int flag=1; set<int> st; while(1) { flag=1; int flag_0=0; //判斷這一組中是否開始就 0 0 int cnt=0; init(); if(x==-1 && y==-1) break; while(scanf("%d%d",&x,&y)) { if(cnt==0 && x==0 && y==0) { flag_0=1; break; } cnt++; st.insert(x); st.insert(y); if(x==y) break; int rootx = find(x); int rooty = find(y); if(rootx == rooty) { flag=0; } else { Union(x,y); } } if(x==-1 && y==-1) continue; //cout<<"len "<<st.size()<<endl; if(flag && st.size()==cnt+1 || flag_0 ==1) cout<<"Yes"<<endl; else cout<<"No"<<endl; st.clear(); //printf("\n"); getchar(); } return 0; }