POJ 1635 Subway tree systems(进阶指南,树的最小表示,递归)

这篇博客详细介绍了算法竞赛中的树的最小表示概念,通过01字符串来表示树,并以POJ 1635题目为例,解析如何从根节点遍历所有边,构建字典序最小的01串。同时,文章还探讨了利用递归方法实现这一过程,包括如何生成和排序子节点的01字符串,最终得到树的最小表示。
摘要由CSDN通过智能技术生成

算法竞赛进阶指南,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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值