题面

这道题是一道标准的种类并查集:

种类并查集是给每个结点一个权值。然后在合并和查找的时候根据情况对权值来进行维护。

通过将原有的区间范围变大使并查集可以维护种类的联系:

#include <iostream>
#include <cstdio>
using namespace std;
int f[200010];
int zhaobaba(int x)
{
    if(f[x]==x) return x;
    return f[x]=zhaobaba(f[x]);
}
int main()
{
    int T;
    cin>>T;
    int t=T;
    while(t--){
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=2*n;i++) f[i]=i;
        bool lala=0;
        for(int i=1;i<=m;i++){
            int u,v;
            scanf("%d%d",&u,&v);
            if(lala) continue;
            if(zhaobaba(u)==zhaobaba(v)){
                lala=1;
                continue;
            }
            f[zhaobaba(u)]=zhaobaba(v+n);
            f[zhaobaba(u+n)]=zhaobaba(v);
        }
        cout<<"Scenario #"<<T-t<<":"<<endl;
        if(!lala){
            cout<<"No suspicious bugs found!"<<endl;
        }
        else{
            cout<<"Suspicious bugs found!"<<endl;
        }
        cout<<endl;
    }
}
02-10 11:02