//有n个成员,并查集开两倍空间 //1~n为一组, n+1~2n为一组。a与b互斥,则a与b反(即b+n)为同一集合, //同时b与a反(a+n)为同一集合 //在union操作中,引入w ,w越大,表面它的根连接的点越多 //合并时确立关系 #include<iostream> using namespace std; const int N=1e6; int p[N]; int w[N]; int find(int x) { if(p[x]!=x) p[x]=find(p[x]); return p[x]; } void unite(int x, int y) { int px=find(x),py=find(y); if (px==py) return; else if(w[px]>w[py]) p[py] = px; else { p[px]=py; if (w[px]==w[py]) w[py]+=w[px]; } } bool judge(int x,int y) { int px=find(x); int py=find(y); return px==py; } int main() { int t; cin>>t; int cnt=0; int n,m; while(t--) { bool flag=1; cin>>n>>m; for(int i=1;i<=2*n;i++) p[i]=i,w[i]=1; int a,b; for(int i=0;i<m;i++) { cin>>a>>b; if (judge(a,b)||judge(a,b+n)) { if (judge(a,b)) flag=false; //是异性则符合条件继续 else continue; } else { unite(a, b+n); unite(a+n, b); } } printf("Scenario #%d: ",++cnt); if(!flag) printf("Suspicious bugs found! "); else printf("No suspicious bugs found! "); } }