hdu1829链接:点击打开链接
本想用vector写,没写出来/衰,看了一下结题报告,哎,我真的没学会并查集。利用并查集,当根节点相同的时候,观察两点与根节点的关系 是同性还不异性,重点是在查找根节点的时候就要更新各点与爷爷的关系
code:
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
int n,m;
int father[2100],relation[2100];//1表示同性,0表示异性
void init(int n)
{
for(int i=0;i<=n;i++)
{
father[i]=i;
relation[i]=1;
}
}
int findd(int n)
{
int nn=father[n];
if(n==father[n])
return nn;
father[n]=findd(nn);
relation[n]=(relation[n]+relation[nn]+1)%2;
return father[n];
}
void uniont(int a,int b,int aa,int bb)
{
father[aa]=bb;
relation[aa]=(relation[a]-relation[b])%2;
}
int main()
{
//freopen("i.txt","r",stdin);
int i,tt=0,t;
scanf("%d",&t);
while(t--)
{
tt++;
scanf("%d%d",&n,&m);
init(n);
int a,b,flag=0;
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
if(flag)
continue;
int aa=findd(a);
int bb=findd(b);
if(aa==bb)
if(relation[a]==relation[b])
flag=1;
uniont(a,b,aa,bb);
}
printf("Scenario #%d:\n",tt);
if(flag)
printf("Suspicious bugs found!\n\n");
else
printf("No suspicious bugs found!\n\n");
}
return 0;
}