Codeforces 573C Bear and Drawing

题意

你要在两条平行直线之间画一棵有n个节点的树,树必须是可平面的(意思就是不能有两条链发生相交的情况)。给出你若干个连边(他们已经组成一棵树),问你是否可能画出符合要求的树。

思路

通过小数据找规律,可以要想把一棵树的安排在两条平行直线上,这棵树需要满足以下几个条件:

  • 首先我们在树上找到一条主链
  • 凡是在主链上的点,它的度数没有限制
  • 与主链直接相连的点,它的度数最大为3
  • 剩下的点,度数最大为2

知道了这些,接下来就是实现的问题了。这里有一种很聪明的实现方法。

  • 首先,统计所有节点的度数。
  • 在每一个叶子节点都发动一次DFS,在DFS过程中若遇到的一切度数小于等于2的点,进入,并做删除标记,否则返回。这一步的目的是清除掉所有叶子节点所属的链(不能直接修改度数,否则会导致删掉整棵树)。
  • 重新统计每个节点的度数,因为刚才只是做标记,没有改变度数。
  • 接下来对于所有曾经为3度现在为1度的点打删除标记,这种点是与主链直接相连的点。
  • 重新统计每个点的度数。
  • 现在每个节点的度数都理应小于3了,因为我们刚才去掉了叶子节点所在的链,如果这棵树正确,一定会删到主链上。接下来又去掉了曾经3度删完1度的节点,这相当于完全去掉了支链。这个时候整棵树理应只剩一条链了,不可能再有度数大于2的节点了。

如果理解有困难,不妨尝试画图帮助理解。

代码

 

Leave a Reply

Scroll to top