算法竞赛进阶指南,91 页,树的最小表示
本题要点:
1、树的最小表示 ,用 01 字符串来表示一个树(每个节点可以有任意多个孩子节点),
从树的根节点开始遍历每条边, 每条边走两次, 每走一次边,写上 0 或 1, 所有字符串连起来就是一个树的01表示
从父节点走向子节点,用 '0’表示;
从子节点走向父节点,用 '1’表示;
假如某个子树的根节点是 father, 其所有的子节点为 son[1], son[2], …, son[n],遍历过程如下:
father走向 son[1] ('0’表示), 遍历son[1] 的所有孩子节点(产生一段01字符串),从 son[1] 走向 father ('1’表示),
father走向 son[2] ('0’表示), 遍历son[2] 的所有孩子节点(产生一段01字符串),从 son[2] 走向 father ('1’表示),
…
father走向 son[n] ('0’表示), 遍历son[n] 的所有孩子节点(产生一段01字符串),从 son[n] 走向 father ('1’表示),
所有的 01 串起来,得到 以 father 为 根的子树的一个 01 表示。然而,father 访问孩子的顺序是可以任意改变的,然后就得到若干个 01字符串,
其中字典序最小的是 树的最小表示
2、 递归实现:
以树 father 为根的 01 字符串 s,得到孩子的各段 01字符串s1[1], s1[2], …, s[n], 用vector 来存,用sort 排序,
再拼接,得到的是father 为根的01字符串的最小表示
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
string a