#255. 虫子的生活
描述
提交
自定义测试
【题目描述】:
Hopper教授正在研究一种稀有虫子的交配行为。他假设它们有两种性别并且它们只与异性交配。在他的实验中,很容易识别虫子和它们的交配行为,因为虫子背后印有编号。
实验中有一群虫子N只,虫子编号1至N。Hopper教授记录了交配行为M条,教授假设每个交配行为是一对异性虫子,请你判断教授的假设有没有错。
【输入描述】:
输入的第一行包含测试组数T(<=6)。每组第一行给出虫子数N和一个空格分隔的交配数M。接下来M行,每行两个虫子编号用空格隔开,表示一个交配行为。
【输出描述】:
对于每组测试数据输出两行。首行输出“Scenario #i:”,其中i表示从1开始的编号的测试组数。第二行输出“No suspicious bugs found!”表示没有发现背离假设的虫子交配行为,或者输出“Suspicious bugs found!”表示假设是错的。
【样例输入】:
2
3 3
1 2
2 3
1 3
4 2
1 2
3 4
【样例输出】:
Scenario #1:
Suspicious bugs found!
Scenario #2:
No suspicious bugs found!
【时间限制、数据范围及描述】:
时间:1s 空间:128M
对于 30%:1<=N<=1000; M<= 1000
对于100%:1<=N<=10000; M<= 100,000
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <cmath>
using namespace std;
int t,n,m,x,y;
bool b[6005];
struct cyq{
int fa,s;
}a[10005];
int find(int u){
if(a[u].fa!=u){
int father=a[u].fa;
a[u].fa=find(a[u].fa);
a[u].s=(a[father].s+a[u].s)%2;
}
return a[u].fa;
}
bool check(int aa,int bb){
int xx=find(aa),yy=find(bb);
if(xx==yy){
if(1!=(2-a[aa].s+a[bb].s)%2) return 1;
}
else{
a[xx].s=(a[aa].s-a[bb].s+3)%2;
a[xx].fa=a[yy].fa;
}
return 0;
}
bool work(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
a[i].fa=i;a[i].s=0;
}
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
if(check(x,y)) return false;
}
return true;
}
int main(){
scanf("%d",&t);
for(int i=1;i<=t;i++){
printf("Scenario #%d:\n",i);
if(!work())printf("Suspicious bugs found!\n\n");
else printf("No suspicious bugs found!\n\n");
}
return 0;
}