标签:
还是属于并查集的变形
两个点只有一条路径连通
给出的两个点事先都是属于两个集合的
需要给出的着条边构成一个集合
算法复杂度还是挺高的
每个我都循环了100000次
set2数组没清空 wrong了一次
#include<cstdio> #include<algorithm> #include<cstring> 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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/a197p/article/details/47065111