标签:bing-cha-j
题目大意:输入n个bug,bug之间有interaction,当前假设异性之间才interaction,但是需要验证,给定这些interaction对,判定是否满足假设,如果相同则有同性恋,后面就算输入数据也不用做处理了,否则就一直处理下去。
解题思路:并查集,具体详见代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1000005;
int fa[maxn], rank[maxn], num[maxn];
void Init(int x)
{
for(int i=0; i<=x; i++)
{
fa[i] = i;
num[i] = rank[i] = 0;
}
}
int Find(int x)
{
if(fa[x] != x)
fa[x] = Find(fa[x]);
return fa[x];
}
void Union(int x, int y)
{
int fx = Find(x);
int fy = Find(y);
if(fx == fy)
return;
if(rank[fx] > rank[fy])
fa[fy] = fx;
else
{
fa[fx] = fy;
if(rank[fx] == rank[fy])
rank[fy]++;
}
}
int main()
{
int cas;
bool flag;
scanf("%d",&cas);
for(int k=1; k<=cas; k++)
{
int m,n,x,y;
flag = false;
scanf("%d%d",&m, &n);
Init(m);
while(n--)
{
scanf("%d%d",&x,&y);
if(!flag)
{
if(!num[x] && !num[y])
{
num[x] = y;
num[y] = x;
}
else if(!num[x] && num[y]!=0)
{
num[x] = y;
Union(x, num[y]);
}
else if(!num[y] && num[x]!=0)
{
num[y] = x;
Union(y, num[x]);
}
else if(num[x]!=0 && num[y]!=0)
{
if(Find(x) == Find(y))
flag = true;
Union(x, num[y]);
Union(y, num[x]);
}
}
}
printf("Scenario #%d:\n",k);
if(flag)
puts("Suspicious bugs found!");
else
puts("No suspicious bugs found!");
if(k != cas)
puts("");
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:bing-cha-j
原文地址:http://blog.csdn.net/qingshui23/article/details/47379527