有一些虫子,已知谁和谁是不同性别的,问有没有矛盾
可以先构造出整个图,然后黑白染色
也可以使用扩展并查集,这里用的是扩展并查集
#include <cstdio>
#include <cstring>
using namespace std;
bool ans;
struct DisjoinSet {
int a[2020];
int b[2020];
void clear(int n) {
for (int i=1;i<=n;i++) a[i]=i;
memset(b,0,sizeof(b));
}
int get(int i) {
if (a[i]==i) return i;
int tmp=get(a[i]);
b[i]=b[i]^b[a[i]];
return a[i]=tmp;
}
void tosame(int x,int y) {
int p,q;
p=get(x);
q=get(y);
if (p==q) {
if (b[x]==b[y]) ans=false;
} else {
a[p]=q;
b[p]=b[x]^b[y]^1;
}
}
};
DisjoinSet c;
int n,m;
int main() {
int t,tt,i,x,y;
ans=true;
scanf("%d",&t);
for (tt=1;tt<=t;tt++) {
scanf("%d%d",&n,&m);
c.clear(n);
ans=true;
for (i=0;i<m;i++) {
scanf("%d%d",&x,&y);
c.tosame(x,y);
}
printf("Scenario #%d:\n",tt);
if (ans) printf("No suspicious bugs found!\n");
else printf("Suspicious bugs found!\n");
printf("\n");
}
return 0;
}