还是属于并查集的变形
两个点仅仅有一条路径连通
给出的两个点事先都是属于两个集合的
须要给出的着条边构成一个集合
算法复杂度还是挺高的
每一个我都循环了100000次
set2数组没清空 wrong了一次
#include#include #include using namespace std;int sett[100000 + 100];int set2[100000 + 100];int find2(int x){ while(x!=sett[x]) x=sett[x]; return x;}int merge2(int fx,int fy){ if(fx == fy) return 1; else if(fx > fy) sett[fx]=fy; else sett[fy] = fx; return 0;}int main(){ for(int i=1;i<=100000;i++) sett[i]=i; int x,y; int flag=1; while(scanf("%d%d",&x,&y)&&x!=-1&&y!=-1) { if(x==0&&y==0){ int countt=0; for(int i=1;i<=100000;i++) if(sett[i]==i&&set2[i]) countt++; if(countt >= 2) flag=0;// printf("countt %d\n",countt); if(flag) printf("Yes\n"); else printf("No\n"); flag = 1; for(int i=1;i<=100000;i++) sett[i]=i; memset(set2,0,sizeof(set2)); } else { set2[x]=1,set2[y]=1; int fx = find2(x); int fy = find2(y); if( merge2(fx,fy) ) { flag=0; } } } return 0;}