标签:
6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1
Yes Yes No
#include <stdio.h> #include <stdlib.h> int pre[100005]; int c[100005]; int a,b,panduan,nx; int find(int x) //查找根节点 { int r=x; while ( pre[r ] != r ) //返回根节点 r r=pre[r ]; int i=x , j ; while( i != r ) //路径压缩 { j = pre[ i ]; // 在改变上级之前用临时变量 j 记录下他的值 pre[ i ]= r ; //把上级改为根节点 i=j; } return r ; } void join(int x,int y) //判断x y是否连通, //如果已经连通,就不用管了 //如果不连通,就把它们所在的连通分支合并起, { int fx=find(x),fy=find(y); //printf("!%d %d\n",fx,fy); if(fx!=fy) { pre[fx]=fy; nx--; } else panduan=1; } int sets() { int i; for(i=0;i<=100000;i++) { pre[i]=i; c[i]=1; } } int main() { int i,t; while(1) { sets(); nx=0; panduan=0; scanf("%d %d",&a,&b); if(a==-1&&b==-1) break; else if(a==0&&b==0) { printf("Yes\n"); } else { if(a!=b) { nx+=c[a]+c[b]; c[a]=0; c[b]=0; join(a,b); } while(1) { scanf("%d %d",&a,&b); if(a==0&&b==0) break; else if(a!=b) { nx+=c[a]+c[b]; c[a]=0; c[b]=0; join(a,b); } } if(panduan==0&&nx==1) printf("Yes\n"); else printf("No\n"); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/Qiao994255978/p/4679422.html