【HDU1272】小希的迷宮(並查集)
阿新 • • 發佈:2019-01-02
這道題幾乎是並查集裸題。
就像 kruskal 建樹一樣,這道題也這麼做。
但有兩個很坑的細節:
1.測試資料可能給的不是一個連通圖,因此最後要判一下所有點是否在同一集合中。
2.如果一組資料給的是空圖,即只有 0,0 ,那麼輸出 yes 。
就這麼多了。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N=100010; int fa[N]; bool vis[N]; int find(int x){ if(x==fa[x]) return x; return fa[x]=find(fa[x]); } int main(){ int u,v,total; bool ok; while(scanf("%d%d",&u,&v)==2 && ~u){ if(u==0 && v==0){ puts("Yes"); continue; } // 細節2 total=0; for(int i=1; i<=100000; ++i) fa[i]=i, vis[i]=false; fa[u]=v; vis[u] = vis[v] = true; ok=true; while(scanf("%d%d",&u,&v)==2 && u) if(ok){ if(find(u)==find(v)){ ok=false; continue; } fa[find(u)] = find(v); vis[u] = vis[v] = true; } // 細節1 for(int i=1; i<=100000; ++i) if(vis[i] && fa[i]==i && (++total)>1){ ok=false; break; } if(ok) puts("Yes"); else puts("No"); } return 0; }