#include<cstdio> #include<iostream> #include<cstdio> #define maxn 2000005 using namespace std; int pre[maxn<<1]; int find(int r) { if(pre[r]==r) return r; else return pre[r]=find(pre[r]); } void merge(int x,int y)//很多人说开两个并查集 不严谨 应该是开两组并查集合 只要后面并入的元素不会在一个集合就好 { x=find(x); y=find(y); if(x!=y) pre[y]=x; } int main() { int t,n,m,flag,Case=0; cin>>t; while(t--) { cin>>n>>m; flag=0; for(int i=1;i<=2*n;i++) pre[i]=i; while(m--) { int x,y; cin>>x>>y; if(find(x)==find(y)) flag=1;//每个集合里面的元素担任的性格必须是相同的 所以 只要在一个集合就矛盾 merge(x,y+n);// x ,y 以不用的性别分别并入两组中 // merge(x+n,y); merge(y,x+n); } if(flag) printf("Scenario #%d:\nSuspicious bugs found!\n\n",++Case); else printf("Scenario #%d:\nNo suspicious bugs found!\n\n",++Case); } return 0; }
时间: 2024-10-11 00:34:19