之前在校oj上面交这题老是过不去
中午到工作室 一发A了 可能是之前rank数组没有开两倍
然后 在POJ上面交果断PE 改了个格式 注意后面是两个\n\n
遇到带权的并查集一般par数组开的大小就是本身数组*权值种类,注意合并的关系就行了
参考POJ1182食物链那一题 三个权值开三倍
/*
qq:1239198605
ctgu_yyf
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
int n,m;
int par[2005*2],rank[2005*2];
void init(int n)
{
for(int i=1;i<=n;i++)
{
par[i]=i;
rank[i]=0;}
}
int find(int x)
{
if(par[x]==x)
return x;
else
return par[x]=find(par[x]);
}
void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x==y)
return ;
if(rank[x]<rank[y])
par[x]=y;
else
{
par[y]=x;
if(rank[x]==rank[y])
rank[x]++;
}
}
bool same(int a,int b)
{
return find(a)==find(b);
}
int main()
{
// ios::sync_with_stdio(false);
int c;
scanf("%d",&c);
for(int i=1;i<=c;i++)
{
scanf("%d%d",&n,&m);
init(2*n);
int flag=0;
int u,v;
for(int j=0;j<m;j++)
{
scanf("%d%d",&u,&v);
if(same(u,v)||same(u+n,v+n))
{
flag=1;
}
else
{
unite(u,v+n);
unite(v,u+n);
}
}
if(flag==1)
printf("Scenario #%d:\nSuspicious bugs found!\n\n",i);
else
printf("Scenario #%d:\nNo suspicious bugs found!\n\n",i);
}
return 0;
}