数据输入有点坑人
并差集水题,判断图连通且没有环
#include<stdio.h> int f[100003],mix[100003]; int find(int x) { if(x!=f[x]) f[x]=find(f[x]); return f[x]; } int main() { int i,j,t,a,b,n,m,num,f1,f2,st,end,flag; while( scanf("%d%d",&n,&m)!=EOF) { flag=1; if(m==-1&&n==-1)break; if(m==0&&n==0){printf("Yes\n");continue;} st=100001;end=-1; for(i=0;i<100000;i++) {f[i]=i;mix[i]=0;} for(;;) { mix[n]=mix[m]=1; if(n<st)st=n; if(m<st)st=m; if(n>end)end=n; if(m>end)end=m; f1=find(n); f2=find(m); if(f1==f2) {flag=0;break;} else f[f1]=f2; scanf("%d%d",&n,&m);if(m==0&&n==0)break; } if(flag==0) { while(1) {scanf("%d%d",&n,&m); if(m==0&&n==0)break;} } else for(i=st+1;i<=end;i++) { if(mix[i]==1 &&find(i)!=find(st)) {flag=0;break;} } if(flag) printf("Yes\n"); else printf("No\n"); } return 0; }