http://acm.pku.edu.cn/JudgeOnline/problem?id=1182
Sample Input
100 7
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5
Sample Output
3
我在这里演示下这个例子
n=100;k=7;
lie=0;
>>d x y
>>1 101 1 x>n lie++;
>>2 1 2 f[1]==1与f[2]==2都是指向自己,接着union_set(1,2,2)将1,2合并
我们进入union_set看看,f[1]=2;r[1]=(r[2]-r[1]+2+2)%3=(0-0+4)%3=1,
即r[1]=1,1吃2(f[1])
>>2 2 3 同上,得到f[2]=3,r[2]=(r[3]-r[2]+2+2)%3=1,2吃3(f[2])
f[3]=3,r[3]=0
>>2 3 3 d==2,x==1,y==3 lie++
>>1 1 3 d=1,x=1,y=3;
我们进入find_set看看,find_set(1) {f[1]==2!=1,t=2,f[1]=find_set(t)
{f[2]==3!=2,t=3,f[2]=find_set(t){f[3]==3,return f[3]即3},f[2]=3
r[2]=(r[t]+r[2])%3=1,return f[2]即3},f[1]=3,r[1]=(r[t]+r[1])%3= 2,return 3(f[1]).即f[1]=3,r[1]=2
d==1,r[1]==2,r[3]==0;r[1]!=r[3]即1与3对各自的上节点不具有相同行为
所以1与3不属于同类 lie++
>>2 3 1 d==2,x==3,y==1
f[3]==3而f[1]==3,所以可以进行真假话的判断
d==2,r[3]==0,r[1]==2;r[3]==(r[1]+1)%3(即3吃1)
>>1 5 5 d==1,x==5,y==5
f[x]==5,f[y]==5,可以进行真假话的判断
d==1,r[x]==5,r[y]==5