kuangbin专题五 并查集 HDU1272 小希的迷宫
2017-12-12 18:09
387 查看
题意:
中文题
题解:
任意两个房间有且仅有一条路径可以相通,可以用并查集来做,如果输入的两个房间号的祖宗是一样的话,就说明,成环了,输出No,还有一种情况是不成环,森林的情况,比如:
1 2 3 4 0 0
正确的输出为No。
只要在最后跑一边for循环检查是否出现两个祖宗就可以知道是否出现森林了。
中文题
题解:
任意两个房间有且仅有一条路径可以相通,可以用并查集来做,如果输入的两个房间号的祖宗是一样的话,就说明,成环了,输出No,还有一种情况是不成环,森林的情况,比如:
1 2 3 4 0 0
正确的输出为No。
只要在最后跑一边for循环检查是否出现两个祖宗就可以知道是否出现森林了。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int MAXN=1e5+7; int f[MAXN]; bool vis[MAXN]; void init() { for(int i=0;i<=1e5;i++) f[i]=i; } int find(int p) { while(p!=f[p]) { f[p]=f[f[p]]; p=f[p]; } return p; } bool Union(int p,int q) { int P=find(p); int Q=find(q); if(P==Q) return true; else { f[Q]=P; } return false; } int main() { int n; while(1) { int a,b,MAX=0; init(); memset(vis,false,sizeof(vis)); bool mark=false,ans=false; while(~scanf("%d%d",&a,&b)) { if(a==-1&&b==-1) { mark=true; break; } MAX=max(max(MAX,a),b); vis[a]=true; vis[b]=true; if(a==0&&b==0) break; if(Union(a,b)) ans=true; } in 4000 t sum=0; for(int i=1;i<=MAX;i++) if(vis[i]&&f[i]==i) sum++; if(mark) break; if(ans||sum>1) printf("No\n"); else printf("Yes\n"); } }
相关文章推荐
- hdu 1272 小希的迷宫[kuangbin带你飞]专题五 并查集
- HDU1272 小希的迷宫 并查集
- HDU1272 小希的迷宫(基础并查集)
- 【HDU1272】小希的迷宫(并查集)
- HDU1272 小希的迷宫 - 并查集
- hdu1272 小希的迷宫 并查集
- HDU1272 小希的迷宫 并查集
- ACM-并查集之小希的迷宫——hdu1272
- HDU1272 小希的迷宫(并查集)
- HDU1272 小希的迷宫 并查集
- 【hdu1272】 小希的迷宫 (并查集)
- hdu1272 小希的迷宫 并查集
- hdu1272小希的迷宫(并查集)
- [并查集] hdu1272 小希的迷宫
- 【并查集】hdu1272 小希的迷宫
- 【并查集判环】HDU1272小希的迷宫【判环模板】
- hdu1272(小希迷宫 并查集)
- [HDU1272]小希的迷宫[并查集]
- 小希的迷宫--hdu1272(并查集)
- hdu1272 小希的迷宫 并查集