题目:http://poj.org/problem?id=2492

方法一:

用mark数组标记如果mark[x]%2==mark[y]%2那么xy就是同性的

View Code
#include<stdio.h>
int father[2002],mark[2002];
int find(int x)
{
int i=x;
int j=father[x];
if(x!=father[x])
father[x]
=find(father[x]);
mark[x]
=(mark[x]+mark[j])%2;////////////x与祖先的关系是由x与父节点的关系和父节点和祖先的关系决定的
while(i!=father[x])
{
j
=father[i];
father[i]
=father[x];
i
=j;
}
return father[x];
}

void merge(int x,int y)
{
int fx=find(x);
int fy=find(y);
father[fx]
=fy;
mark[fx]
=(mark[y]-mark[x]+1)%2;//r[x]与r[y]相对于新的根节点必须相差1个等级,因为他们不是gay
}

int main()
{
int t,i,k,n,m,x,y,flag;
scanf(
"%d",&t);
for(k=1;k<=t;k++)
{
scanf(
"%d%d",&n,&m);
for(i=1;i<=n;i++)
{
father[i]
=i;
mark[i]
=0;
}
flag
=0;
while(m--)
{
scanf(
"%d%d",&x,&y);
if(flag)
continue;
if(find(x)==find(y))
{
if(mark[x]%2==mark[y]%2)
flag
=1;
}
else
merge(x,y);
}
printf(
"Scenario #%d:\n",k);
if(flag==1)
printf(
"Suspicious bugs found!\n");
else
printf(
"No suspicious bugs found!\n");
printf(
"\n");
}
return 0;
}

  

方法二:   

用other[x]表示x的另一半是谁。那么就可以把同性的从放在一棵树里,不同性的虫在两棵树中。当两只不同性的虫出现在一棵树中就出现了同性恋

     

View Code
#include<stdio.h>
int set[2001],other[2001];
int find(int x)
{
if(x==set[x])
return x;
set[x]=find(set[x]);
return set[x];
}

void merge(int x,int y)
{
int fx=find(x);
int fy=find(y);
set[fx]=fy;
}

int main()
{
int t,n,m,i,x,y,fx,fy,mark,d;
scanf(
"%d\n",&t);
d
=0;
while(t--)
{
d
++;
scanf(
"%d%d",&n,&m);
for(i=0;i<n+1;i++)
{
set[i]=i;
other[i]
=0;
}
mark
=0;
while(m--)
{
scanf(
"%d%d",&x,&y);
if(!mark)
{
fx
=find(x);
fy
=find(y);
if(fx==fy)
mark
=1;
else
{
if(other[x])
{
merge(other[x],y);
}
else if(other[y])
{
merge(other[y],x);
}
else
{
other[x]
=y;
other[y]
=x;
}
}
}
}
printf(
"Scenario #%d:\n",d);
if(mark)
printf(
"Suspicious bugs found!\n");
else
printf(
"No suspicious bugs found!\n");
printf(
"\n");
}
return 0;
}

  

 posted on 2011-07-22 15:09  渲染独白  阅读(172)  评论(0编辑  收藏  举报