hdu 1272 小希的迷宫
并查集裸题,可以用来学习并查集的性质
1.并查集判断是否成环,如果一条边的两个点的祖先相同,那么成环
2.整个祖先数组中p[i]=i个个数就是连通分量的个数
题目要求:
1.若没哟普任何边直接输入0 0 要输出Yes
2.若成环,No
3.不管是否成环,图不连通,No
4.注意输入中的点是任意的,编号并不连续,所以要标记哪些点出现在输入中,没有出现在输入中的点不要管
#include <cstdio> #include <cstring> #define N 100010 int p[N],use[N]; int find(int x) { while(x!=p[x]) x=p[x]; return x; } int main() { int u,v,x,y,OK; while(1) { OK=1; scanf("%d%d",&u,&v); if(u==-1 && v==-1) break; else if(u==0 && v==0) printf("Yes\n"); else { for(int i=1; i<N; i++) { p[i]=i; use[i]=0; } use[u]=use[v]=1; x=find(u); y=find(v); if(x!=y) p[x]=y; else { printf("No\n"); continue; } while(1) { scanf("%d%d",&u,&v); if(u==0 && v==0) break; use[u]=use[v]=1; x=find(u); y=find(v); if(x!=y) p[x]=y; else OK=0; } int count=0; for(int i=1; i<N; i++) if(use[i] && p[i]==i) count++; if(count>1) OK=0; if(OK) printf("Yes\n"); else printf("No\n"); } } return 0; }