题目链接在这里
题目大意
bug分公母,有n个bug,m个描述,每个描述里有x和y,代表这两个bug是一对。问给出m个描述之后会不会有同性恋现象。
解题思路
每个Bug的权值初始时设置成0,权值代表着这个bug和其祖宗的性别差异,如果是1就表示是异性,0代表同性。然后在合并的时候,如果发现它们之前已经合并过了并且它们的权值相加为偶数,则就是同性恋。
代码如下
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <iostream>
#define rep(i, n) for(int i = 0; i < n; ++i)
#define clr(x) memset(x, 0, sizeof(x))
using namespace std;
const int MaxN = 2010;
int n, m;
int par[MaxN], Rank[MaxN];
int T;
void init(){
for(int i = 0; i < MaxN; ++i){
par[i] = i;
Rank[i] = 0;
}
}
int Find(int x){
if(x == par[x]) return x;
int tmp = par[x];
par[x] = Find(par[x]);
Rank[x] = (Rank[x] + Rank[tmp]) % 2;
return par[x];
}
bool unite(int x, int y){
int fx = Find(x);
int fy = Find(y);
if(fx == fy){
if((Rank[x] + Rank[y]) % 2 == 0) return false;
else return true;
}
par[fx] = fy;
Rank[fx] = (1 + Rank[y] - Rank[x]) % 2;
return true;
}
int main(){
ios::sync_with_stdio(false);
cin >> T;
string co[2] = {
"No suspicious bugs found!",
"Suspicious bugs found!"
};
rep(tt, T){
init();
int flag = 0;
cin >> n >> m;
int x, y;
rep(i, m){
cin >> x >> y;
if(!unite(x, y)) flag = 1;
}
cout << "Scenario #" << tt + 1 << ":" << endl;
cout << co[flag] << endl << endl;
}
return 0;
}