Description
给定一个 $n$ 个点的有向图,求 $2$ 个问题:
- 如果一个点能覆盖所有与它连通的点,现在需要选择最少的点来覆盖所有的点。
- 最少增加几条边能使这个有向图变成 强连通分量 。
Source
Solution
先考虑第 $1$ 个问题。
一个 强连通分量 里的点可以互相到达,选择强连通分量里的任何一个点都能覆盖整个强连通分量,因此可以把它们缩成一个点。缩完点后图变成一个 DAG(有向无环图至少存在一个入度为 $0$ 的点),入度为 $0$ 的点是必须要选的,因为没有点能覆盖它们,而入度不为 $0$ 的点都能被其它点覆盖,所以问题就变为求入度为 $0$ 的点的个数。
再考虑第 $2$ 个问题。
因为原图中的 强连通分量 已经连通,所以没有必要在强连通分量内增加边,可以沿用上个问题缩点后的图。强连通分量 没有 出度为 $0$ 的点 和 入度为 $0$ 的点,所以我们现在需要连一些边,使该图中这些点的出度或入度增加。显然最优的方案是在 出度为 $0$ 的点 和 入度为 $0$ 的点 之间连一条边,一一匹配完后多出来的点与其它点连边,所以问题的答案就是 出度为 $0$ 的点数 和 入度为 $0$ 的点数 的较大值。如果原来的图本身就是一个强连通分量,新图将会是一个点,出度和入度为 $0$ 。若按照上述做法,答案将是 $1$,但实际答案是 $0$,所以需要特判这种情况。
两个问题的时间复杂度均为 $O(n)$ 。
Code
1 |
|