题意:有n个虫子,人们认为只有性别不同的时候才会发生性关系,现在给出m组虫子发生了关系,问是否存在同性恋(这题目...真变态)
思路:并查集,将性别相同的划分在一个集合,不同的划分在另一个
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
using namespace std;
#define maxn 2010
#define LL long long
int cas=1,T;
int pre[maxn];
int resex[maxn];
int rank[maxn];
int n;
void init()
{
for (int i = 1;i<=n;i++)
{
pre[i]=i;
resex[i]=0;
rank[i]=0;
}
}
int Find(int x)
{
int r = x;
while (r!=pre[r])
r=pre[r];
int i = x,j;
while (pre[i]!=r)
{
j = pre[i];
pre[i]=r;
i=j;
}
return r;
}
void mix(int x,int y)
{
int fx = Find(x),fy=Find(y);
/* if (rank[fx] > rank[fy])
pre[fy]=fx;
else
{
pre[fx]=fy;
if (rank[x]==rank[y])
rank[y]++;
}*/
if (fx!=fy)
pre[fx]=fy;
}
int main()
{
//freopen("in","r",stdin);
scanf("%d",&T);
while (T--)
{
int flag = 1;
int m;
scanf("%d%d",&n,&m);
init();
for (int i = 1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
if (!flag)
continue;
int x = Find(a);
int y = Find(b);
if (x==y)
flag = 0;
if (resex[a]!=0)
mix(resex[a],b);
else
resex[a]=b;
if (resex[b]!=0)
mix(resex[b],a);
else
resex[b]=a;
}
printf("Scenario #%d:\n",cas++);
if (!flag)
printf("Suspicious bugs found!\n\n");
else
printf("No suspicious bugs found!\n\n");
}
//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
return 0;
}