题目链接
题意:T组数,每组数先输入虫子的总数N与发生关系的数目M,虫子分雌雄两种,下面有M行,每行两个数a,b,代表虫子a、b发生了不可描述的关系,问虫子中是否存在同性恋(依据前面发生的关系推测)。(污污的)
题目解析:并查集。一开始想的是在同一个集合的虫子不能发生关系,想法是对的,但这时候考虑的集合的属性是发生关系。
3 3
1 2
2 3
3 1
这组数是有同性恋的,没错。
4 4
1 2
2 3
3 4
1 4
这组数不存在,A-B-A-B的情况。
又因为输入时的顺序并不是按照雌雄给出的,所以就有点纠结。
换个角度考虑,把集合的属性定义为性别,思路就豁然开朗了许多。
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <climits>
using namespace std;
const int MAXN=4*1e3+10;
int parent[MAXN];
int N, M;
bool flag;
int Find(int a)
{
while(parent[a]!=a)
a=parent[a];
return a;
}
void start()
{
for(int i=0;i<MAXN;i++)
parent[i]=i;
flag=false;
}
void add(int a, int b)
{
a=Find(a);
b=Find(b);
parent[a]=b;
}
int main()
{
int T;
cin>>T;
for(int t=1; t<=T; t++)
{
scanf("%d%d",&N,&M);
int a, b;
start();
while(M--)
{
scanf("%d%d",&a,&b);
if(flag)continue;
int c=Find(a);
int d=Find(b);
if(c!=d)
{
add(a,b+N);///a与b是异性,b+N代表的是与b异性的集合,所以把a加到与b异性的集合b+N中去。
add(b,a+N);
}
else
flag=true;
}
cout<<"Scenario #"<<t<<':'<<endl;
if(flag)
cout<<"Suspicious bugs found!"<<endl<<endl;
else
cout<<"No suspicious bugs found!"<<endl<<endl;;
}
return 0;
}