食物链(并查集问题)pku1182

来源:互联网 发布:软件行业的发展前景 编辑:程序博客网 时间:2024/05/16 07:27

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

原创粉丝点击