您的位置:首页 > 其它

poj解题报告——1182

2014-12-12 23:30 253 查看
这题是用并查集做,本来这题是学校里用来做练习的,然后就顺便拿过来了了。思路是这样的,可以看出动物之间关系只有吃和被吃,以及同类两种关系。标记吃与被吃的点,那么,这种关系就能够表示了。要注意的是,每次的判断是否同类,是否吃和被吃的背离条件不能缺少。

代码如下

#include<stdio.h>

#define SIZE 50010

int n,k;

int d,x,y;

struct node

{

int pa;

int ki;

}a[SIZE];

void Init(int n)

{

int i;

for(i=1;n-i>=0;i++)

{

a[i].pa=i;

a[i].ki=0;

}

}

int findPa(int n)

{

int Pa,Root;

if(a
.pa!=n)

{

Pa=a
.pa;

Root=findPa(a
.pa);

a
.ki=(a
.ki+a[Pa].ki+3)%3;

return a
.pa=Root;

}

else

return n;

}

void Union(int x,int y,int del)

{

int xx=findPa(x);

int yy=findPa(y);

a[xx].pa=yy;

a[xx].ki=(a[y].ki-(a[x].ki+del)+3)%3;

}

void main()

{

int wrong,i,xx,yy,n,k;

scanf("%d %d",&n,&k);

Init(n);

wrong=0;

for(i=0;k-i>0;i++)

{

scanf("%d %d %d",&d,&x,&y);

if(x>n||y>n)

wrong++;

else if(x==y&&d==2)

wrong++;

else

{

xx=findPa(x);

yy=findPa(y);

if(xx==yy)

{

if(d==1&&(a[x].ki!=a[y].ki))

wrong++;

if(d==2&&(a[y].ki-a[x].ki+3)%3!=1)

wrong++;

}

else

{

Union(x,y,d-1);

}

}

}

printf("%d\n",wrong);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: