#include<cstdio> using namespace std; const int Maxn = 2019; int rel[Maxn],father[Maxn]; //0表示同性,1表示异性 //参考网上的第二种解法,也就是带权(种类)并查集 void init(int n) { for(int i = 1; i<=n; ++i) { father[i] = i; rel[i] = 0; } } int find(int x) { if(x!=father[x]) { int px = find(father[x]); rel[x] = rel[x]^rel[father[x]];//若x与父节点的权值不一样,则x与父节点性别不同,难点 father[x] = px; } return father[x]; } int _union(int a,int b) { int x = find(a); int y = find(b); if(x==y) { if(rel[a]==rel[b]) return 1; return 0; } else { father[x] = y; rel[x] = !(rel[a]^rel[b]); } return 0; } int main() { int t,n,m; int a,b; scanf("%d",&t); for(int i = 1; i<=t; ++i) { scanf("%d%d",&n,&m); bool f = false; init(n); while(m--) { scanf("%d%d",&a,&b); if(!f&&_union(a,b)) f = true; } printf("Scenario #%d:\n",i); puts(f?"Suspicious bugs found!\n":"No suspicious bugs found!\n"); } return 0; }