这道题是一道标准的种类并查集:
种类并查集是给每个结点一个权值。然后在合并和查找的时候根据情况对权值来进行维护。
通过将原有的区间范围变大使并查集可以维护种类的联系:
#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; } }