综上所述,如果图中不存在奇数长度的环,且忽略所有不在环上的节点后,图上只存在若干长度为偶数的环,记环的个数为 k k k,并且每个长度为偶数的环的染色方案为 2,根据乘法原理,总的方案数为 2 k 2^k 2k(可以通过样例 2 建图理解)。
代码思路:先根据拓扑排序的思路,将所有不在环上的节点排除,再统计每个环上节点的个数,并统计环的个数 k k k。如果存在奇数长度的环,答案为 0,否则答案为 2 k 2^k 2k。
收敛的数组
知识点:基环树、并查集
思路:
对于每一轮赋值操作, i = a i i = a_i i=ai,可以认为数 i i i 变成了 a i a_i ai,因此可以看成是节点 i i i 到节点 a i a_i ai 有一条出边,表示从节点 i i i 能一步到达节点 a i a_i ai。更具体地,每个数 i i i 都看成一个节点,编号从 1 ∼ n 1 \sim n 1∼n,对于输入的每个 a i a_i ai,可以认为从节点 i i i 到节点 a i a_i ai 有一条出边,形成一个基环内向森林(可能有多个基环内向树)。
题目的问题在图上可以转换为,修改最少的边使得可以找到一个节点 x,所有节点(包括 x 本身)能经过 n - 1 条边到达 x。
对于一棵基环内向树而言
选择的节点 x 必须在环上,因为如果选择的点 x 在环外,那么环上的点无论如何都无法到达 x,不符合要求。
环上的节点只能有一个(自环),因为如果环上的节点大于等于 2,随意选择任何一个节点作为 x,那么每个节点到达 x 的距离都是不一样的,因此不存在任何距离 k(题目中是 n - 1),使得每个节点到 x 的距离都是 k。
综上所述,对于每一棵基环内向树而言,我们需要找到一个终点,让它变成自环,这样才能使得每个点到终点的距离为 n - 1。