标签:分组并查集
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