#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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.