9.23/9.26强连通分量学习笔记

9.23

Popular cows

题目大意:

有n只牛,牛A认为牛B很牛,牛B认为牛C很牛。给你M个关系(谁认为谁牛),求大家都认为它很牛的牛有几只。PS:如果牛A认为牛B很牛,牛B认为牛C很牛。那么我们就认为牛A认为牛C很牛。


学习目标:

强连通分量分解(或称缩点)的Kosaraju算法


算法解释:

强连通分量分解 对于一个有向图顶点的子集S,如果在S内任取两个顶点u和v,都能找到一条从u到v的路径,那么就称S是强连通的。如果在强连通的顶点集合S中加入其他任意顶点集合后,它都不再是强连通的,那么就称S是原图的一个强连通分量SCC(StronglyConnectedComponent)。任意有向图都可以分解成若干个不相交的强连通分量,这就是强连通分量的分解。把分解后的强连通分量缩成一个顶点,就得到一个DAG(有向无环图)。


Kosaraju算法:

强连通分量分解可以通过两次简单的DFS实现。第一次DFS时,选取任意顶点作为起点,遍历所有尚未访问过的顶点,并在回溯前给顶点标号(后序遍历)。对剩余的未访问过的顶点,不断重复上述过程。完成标号后,越接近图的尾部(深度优先搜索树的叶子),顶点的标号越小。第二次DFS时,先将所有边反向,然后以标号最大的顶点为起点进行 DFS。这样DFS所遍历的顶点集合就构成了一个强连通分量。之后,只要还有尚未访问的顶点,就从中选取标号最大的顶点不断重复上述过程。


题解:

用强连通分量分解,找出其中出度为0的顶点即为红人。

这些代码是本人千辛万苦写出来的,借鉴即可,请勿抄袭,故用图片,请原谅。

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/wuhu-xiaoshen/p/4918648.html