#include <stdio.h>
#include <string.h>
int f[50005];
int rank[50005]; //rank[x]值为0,则与父节点同级,为1则被父节点吃,为2则吃父节点
int find(int i)
{
if(i==f[i])
return f[i];
int a=f[i];
f[i]=find(f[i]);
rank[i]=(rank[i]+rank[a])%3;
return f[i];
}
int main()
{
int n,k;
int i;
int d,x,y;
int sum;
int fr,ed;
scanf("%d%d",&n,&k); //注意不能打while,会WA
{
sum=0;
for(i=0;i<=n;i++)
{
f[i]=i;
rank[i]=0;
}
for(i=0;i<k;i++)
{
scanf("%d%d%d",&d,&x,&y);
if(x>n||y>n||(d==2&&x==y))
{
sum++;
continue;
}
d-=1;
fr=find(x);
ed=find(y);
if(fr==ed)
{
if((rank[y]-rank[x]+3)%3!=d) //归纳所有情况得出的结论
{
sum++;
continue;
}
}
else
{
f[ed]=fr;
rank[ed]=(rank[x]-rank[y]+3+d)%3; //若两点不在同一集合,则合并父节点
}
}
printf("%d\n",sum);
}
return 0;
}
并查集 食物链 POJ1182
最新推荐文章于 2022-12-22 21:28:01 发布