http://acm.hdu.edu.cn/showproblem.php?pid=1272 题意:判断一个迷宫是否存在多条从i点到j点的路径。 解法:并查集。 #include <iostream> #include <cstring> using namespace std; int father[100001],v[100001]; void init() { int i; for(i=0;i<=100000;i++) father[i]=i; } int getfather(int x) { while(x!=father[x]) x=father[x]; return x; } bool union_ab(int x,int y) { int fx=getfather(x); int fy=getfather(y); if(fx==fy) return false; father[fx]=fy; return true; } int main() { while(1) { bool flag=false,ans=false; init(); int a,b,i; memset(v,0,sizeof(v)); while(scanf("%d%d",&a,&b)) { if(a==-1&&b==-1) {flag=true;break;} if(a==0&&b==0) break; if(ans) continue; if(!union_ab(a,b)) ans=true; v[a]=v[b]=1; } int sum=0; if(!ans) { for(i=1;i<=100000;i++) { if(v[i]&&getfather(i)==i) sum++; if(sum>1){ans=true;break;} } } if(flag) break; if(ans) printf("No/n"); else printf("Yes/n"); } return 0; }