题目
样例输入
2
4 3
3 2
2 0
2 1
3 3
1 0
2 1
0 2
样例输出
Case 1: 2
0 1
Case 2: 2
0 1 2
思路
通过逆后序序列序列求出强连通分支,然后再对强连通分支进行dfs计算票数。
在存图时,存一个原图与一个反图,然后对原图进行dfs,求出逆后序序列。
通过逆后续序列,跑dfs,不再使用vis数组记录该点是否到达,而使用c数组记录是否被标记为某一个强连通分支。如果未被标记,进行dfs并将其标记,否则不跑dfs。
在分出强连通分支之后,进行缩点,将每一个强连通分支缩成一个点(降低复杂度),因为同一个分支中每个人赞成票是一样的。在Edge2中进行遍历,如果边邻接的两个点不属于同一强连通分支,则将(c[ x ],c[ y ])作为一条边插入缩边后的图。为了降低复杂度,声明一个bool类型的二维数组,记录该边是否被插入,对于已经插入的边,不再重复插入。
记录每个强连通分支中点的个数。
缩图后(缩反图)只需要对入度为0的点进行dfs,将经过的强连通分支的点的个数相加,最后减去1,取最小的值,即为答案。</