刚考完七级!
题意分析
给定一张有 nnn 个节点,nnn 条边,每个节点的度数都为 222 的图,为节点上色,要求每条边连接的两个顶点颜色不同,问最少需要几种颜色。
解题思路
介绍一种比较新颖的做法。
题目中描述了一张图,但是没有说是联通的,所以需要考虑每一个子图,然后因为子图之间不受影响,所以仅需求出其中的最大值即可。
接下来考虑每一个连通子图。拥有 nnn 个节点的连通子图中,每一个节点的度数都为 222 ,可以知道一共有 nnn 条边,还能得出一个更关键的信息:这个子图可以一笔画(拥有 000 个或 222 个度数为奇数的连通图可以一笔画)。因此可以将一个连通图拉成一条链表示。例如题中的样例三,就可以拉成 1 4 2 5 3 的链。接下来问题就转化成了:为一条长度为 nnn 的链上色,要求开头与结尾颜色不同,且相邻的两个节点颜色不同,至少要用几种颜色。
接下来用数字代指颜色,考虑分类讨论:若 nnn 为奇数,可以使用 1 2 1 2 1 2 ... 的构造方式,可最后结尾是 111 ,开头也是 111 ,因此需要将结尾换成 333 ,一共使用 333 种颜色;若 nnn 为偶数,依然可以使用 1 2 1 2 1 2 ... 的构造方式,结尾是 222 ,开头是 111 ,符合规则,使用 222 种颜色。
总而言之,若一个连通子图有 nnn 个节点,若 nnn 为奇数,则需 333 种颜色,若 nnn 为偶数,则需 222 种颜色。
但是是否需要考虑 n=1n = 1n=1 的情况呢?不,当 n=1n = 1n=1 时,那个节点的度数将为 000 ,而题目保证每个节点的度数都为 222 所以不可能出现 n=1n = 1n=1 的情况。
接下来只需用 bfs 或 dfs 统计每个联通子图的大小就行了。时间复杂度 O(V+E)O(V + E)O(V+E) 。
参考代码
作者考试时第二题没有做出来 T-T
(这份代码应该是对的,暂时还没有提交,错了我会 update 的,反正考试时做对了)