给你多组n和m,表示,n和m联通,判断是否存在回路,若存在,输出Yes,否则为No
成回路时,输入的两个有共同的根节点。
只连通时,根节点为1,
#include"stdio.h" int set[100005],visit[100005],flag; int find(int x) { int i,r; while(set[r]!=r) r=set[r]; while(r!=set[x]) { i=set[x]; set[x]=r; x=i; } return r; } void merge(int x,int y) { int fx,fy; fx=find(x); fy=find(y); if(fx<fy)set[fy]=fx; else if(fy<fx)set[fx]=fy; else flag=0; } int main() { int i,n,m,cnt; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) { printf("Yes\n");continue; } if(n==-1&&m==-1) break; for(i=1;i<=100000;i++) { set[i]=i; visit[i]=0; } flag=1; visit[n]=visit[m]=1; merge(n,m); while(scanf("%d%d",&n,&m)!=EOF&&n!=0) { merge(n,m); visit[n]=visit[m]=1; } cnt=0; for(i=1;i<=100000;i++) { if(visit[i]&&set[i]==i) cnt++; if(cnt>1) flag=0; } if(flag) printf("Yes\n"); else printf("No\n"); } return 0; }