标签:分组并查集
2 3 3 1 2 2 3 1 3 4 2 1 2 3 4
Scenario #1: Suspicious bugs found! Scenario #2: No suspicious bugs found!HintHuge input,scanf is recommended.
//考察知识点:分组并查集,听说有两种办法,但是只会这一种 //相较于一般的并查集,分组并查集,在查找父节点的函数方面没有做改动, //在合并的时候 出现了选择性。主要改变在于merge函数上面。 //变动为 /* void merge(int x,int y) { int fx=find(x); int fy=find(y-max); if(fx==fy) { flag=0; return ; } fy=find(y); if(fx!=fy) father[fx]=fy; } */ #include<stdio.h> #define max 2020 int father[2*max]; int flag; int find(int x) { int r=x; while(r!=father[r]) r=father[r]; return r; } void merge(int x,int y) { int fx=find(x); int fy=find(y-max); if(fx==fy) { flag=0; return ; } fy=find(y); if(fx!=fy) { father[fx]=fy; } } int main() { int t; scanf("%d",&t); int a,b,m,n,count=1; while(t--) { scanf("%d%d",&n,&m); for(int i=1;i<=max+n;++i) { father[i]=i; } flag=1; for(int i=1;i<=m;++i) { scanf("%d%d",&a,&b); if(flag) { merge(a,b+max); merge(b,a+max); } } printf("Scenario #%d:\n",count++); if(flag) { printf("No suspicious bugs found!\n\n"); } else printf("Suspicious bugs found!\n\n"); } return 0; }
标签:分组并查集
原文地址:http://blog.csdn.net/ice_alone/article/details/44514253