CF611H 题解
First Post:
Last Update:
Last Update:
看出类似 Hall 定理的结论后就在向网络流上靠,结果连基本的剥叶子构造都忘记了。
我们将每种位数看成一种颜色,问题就是给出每种颜色的点集大小与颜色两两之间的边集大小,还原出一棵树。
首先判断题目给出的东西是否有解,可以用类似 Hall 定理的思路,枚举一个颜色子集 S,那么 S 的导出子图的边数必须小于 S 中的点数,必要性显然,充分性不会证。感性理解,对于一棵树,如果枚举树上的点集然后检查这个条件,那么这是充要的。但现在我们因为知道的信息不够多,只能枚举每个颜色集合,大胆猜测这也是充要的。
基于此直接剥叶子即可。枚举叶子所在的颜色 i 和叶子父亲所在的颜色 j,删掉这一条边后再 Check 即可。如果 Check 成功,就将 i 中编号最大的点连向 j 中编号最小的点(这个编号最大与最小不是必然的,只是我们需要对每个颜色选定一个接收其它颜色连边的关键点,同时保证这个关键点最后被删掉)。
做到最后,可能两个不同的颜色 i,j 之间还存在一条边,直接连过去即可。
C++ - 57 lines
expand
1 |
|
Gitalking ...