URAL1069

来源:互联网 发布:幸运抽奖软件作弊 编辑:程序博客网 时间:2024/06/02 21:52

一个节点在Prufer编码中出现几次,说明有几个子节点。

不出现说明是叶子节点。

 

保存各个节点的子节点数count[].

建立一个叶子节点集合leafs。leafs需要保持有序,可以使用java中的TreeSet

 

算法步骤:

遍历Prufer编码,取出当前值father

取出所有叶子节点leafs中的最小值min,其父亲就是father节点,保存两者关系

count[father]减一,如果count[father]==0,将father加入leafs

leafs.remove(min);


关键代码:

for (Integer father : Prufer) {Integer min = leafs.first();ADJ[min].add(father);ADJ[father].add(min);leafs.remove(min);count[father]--;if (count[father] == 0) {leafs.add(father);}}