Huge input,scanf is recommended.
#include <iostream>
#include <cstdio>
using namespace std;
int par[2020],relation[2020];
bool flag;
void init(int n)
{
for(int i = 1; i <= n; i++)
{
par[i] = i;
relation[i] = 0;
}
}
int find(int x)
{
if(par[x] == x)
return x;
int temp = par[x];
par[x] = find(par[x]);
relation[x] = (relation[x] + relation[temp] + 2)%2;//儿子到父亲 + 父亲到爷爷 = 儿子到爷爷
return par[x];
}
bool Union(int a,int b)
{
int root1 = find(a);
int root2 = find(b);
if(root1 == root2)
{
if(relation[a] == relation[b])
flag = true;
}
else
{
par[root1] = root2;
relation[root1] = (relation[b] - relation[a]+1 + 2)%2;//更新节点 新节点必须和连接的这个节点 差1 保证不是同性恋
}
return flag;
}
int main()
{
int number,n,m,bug1,bug2;
scanf("%d",&number);
for(int i = 1; i <=number; i++ )
{
scanf("%d%d",&n,&m);
flag = false;
init(n);
for(int j = 1; j <= m; j++)
{
scanf("%d%d",&bug1,&bug2);
if(flag)
continue;
flag = Union(bug1,bug2);
}
if(flag)
printf("Scenario #%d:\nSuspicious bugs found!\n",i);
else
printf("Scenario #%d:\nNo suspicious bugs found!\n",i);
printf("\n");
}
return 0;
}