#include <stdio.h>
#include <stdlib.h>
int set[2001],num[2001],h[2001];
int find(int x)//之前我的并查集的find一直是在用循环来需找根节点,这道题要用递归,因为这个题的find 用while去写的话。。。我不会= =。。。
{
if(x!=set[x])
{
int y = set[x];
set[x] = find(set[x]);
num[x] += num[y];
}
return set[x];//记得一定是要返回set[x]因为返回x的话这里的声明是的原值。与while 不一样。
}
void merge(int x, int y)
{
int a = find(x);
int b = find(y);
if(a!= b)
{
if(h[a]>h[b])
{
set[b] = a;
num[b] = (num[x]-num[y]+1);//因为h[a]的树比较高,所以这里用num[x]-num[y],事实上如果这个数很大的话我建议加上%2,因为加上%2结果不会改变~;
}
else
{
set[a] = b;
num[a] = (num[y]-num[x]+1);
if(h[a] == h[b])
h[b]++;
}
}
}
int main()
{
int i, j, m, n,t,a,b,g;
long k;
k = 0;
scanf("%d", &t);
while(t--)
{
k++;
scanf("%d%d", &n, &m);
int leap = 1;
for(i = 1 ; i <= n ; i++)
set[i] = i,h[i] = 0,num[i] = 0;
for(i = 1 ; i <= m ; i++)
{
scanf("%d%d", &a,&b);
if(a!=b)
merge(a,b);
if(find(a) == find(b)&&num[a]%2==num[b]%2)//同一个根节点跟根节点的距离%2相同
leap = 0;
}
printf("Scenario #%ld:\n",k);
if(leap)
printf("No suspicious bugs found!\n");
else
printf("Suspicious bugs found!\n");
if(t!=0)
printf("\n");
}
return 0;
}