您的位置:首页 > 其它

poj 1182 食物链 并查集

2011-07-24 17:32 435 查看
/*
和一个城市两个帮差不多,那个是只有两个状态,这道题成三个了
找一下合并集合的时候的公式就行了
本代码中:rel[i]表示i的等级,集合根的等级是0,2级可以吃1级,1级吃0级,0级吃2级
*/
#include<stdio.h>
int ji[50010],rel[50010];
int root(int x)
{
int t;
if(x==ji[x])
return x;
t=ji[x];
ji[x]=root(ji[x]);
rel[x]=(rel[t]+rel[x])%3;
return ji[x];
}
void bing(int o,int x,int y,int xx,int yy)
{
if(o==1)
{
ji[yy]=xx;
rel[yy]=(rel[x]-rel[y]+3)%3;
}
else
{
ji[yy]=xx;
rel[yy]=(rel[x]-rel[y]+2)%3;
}
}
int jia(int o,int x,int y,int xx,int yy)
{
if(o==1)
{
if(xx==yy)
{
if(rel[x]==rel[y])
return 0;
else return 1;
}
else return 0;
}
else
{
if(xx==yy)
{
if((rel[y]+1)%3==rel[x])
return 0;
else return 1;
}
else return 0;
}
}
int main()
{
int n,m,i,o,x,xx,yy,y,lie=0;;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
ji[i]=i;
rel[i]=0;
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&o,&x,&y);
if(x>n||y>n)
{
lie++;
continue;
}
if(o==2&&x==y)
{
lie++;
continue;
}
xx=root(x);
yy=root(y);
if(jia(o,x,y,xx,yy))
{
lie++;
continue;
}
if(xx!=yy)
bing(o,x,y,xx,yy);
}
printf("%d\n",lie);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bing