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++;
}

浙公网安备 33010602011771号