prufer板子

prufer:
一种将带标号的树用一个唯一的长度为\(n-2\)整数序列表示的方法。

Prüfer 是这样建立的:
每次选择一个编号最小的叶结点并删掉它,然后在序列中记录下它连接到的那个结点。重复 𝑛 −2

        rep(i,1,n-1){
            cin>>f[i];
            deg[i]++;
            deg[f[i]]++;
        }
        int pos=1;
        for(int i=1;i<=n-2;i++){
            while(deg[pos]!=1)pos++;
            p[i]=f[pos];
            while(i<=n-2 && --deg[p[i]]==1 && p[i]<pos){
                p[i+1]=f[p[i]];
                i++;
            }
            pos++;
        }

Prüfer 序列的性质
在构造完 Prüfer 序列后原树中会剩下两个结点,其中一个一定是编号最大的点 𝑛
每个结点在序列中出现的次数是其度数减 1
(没有出现的就是叶结点)

prufer重构树:

        rep(i,1,n)deg[i]++;
        for(int i=1;i<=n-2;i++){
            cin>>p[i];
            deg[p[i]]++;
        }
        p[n-1]=n;
        int pos=1;
        rep(i,1,n-1){
            while(deg[pos]!=1)pos++;
            f[pos] = p[i];
            while(i<=n-1 && --deg[p[i]]==1 && p[i]<pos){
                f[p[i]]=p[i+1];
                i++;
            }
            pos++;
        }
posted @ 2025-10-21 12:44  Marinaco  阅读(3)  评论(0)    收藏  举报
//雪花飘落效果