知识背景:首先明确强连通分量(strongly connected component)的概念,从任一顶点能够到达任一其他顶点的有向图 的顶点子集,而任意有向图均可以分解成若干不相交的scc。把每个scc视作一个顶点,可得到一个DAG。
实现算法:两次dfs,第一次 dfs 遍历将顶点后序(post order)记录下来vs(vector),这里需要注意的是,不管从哪个点dfs,由于是后序记录,故最终得到的记录是一样的,vs中的顶点(按下标)从前至后对应在DAG中为从尾到头。第二次dfs对于vs中的元素从尾到头进行,使用反向边,故每次dfs只能访问到同一个强连通分量。因而每次dfs时给所到顶点加上一个表示第几个scc的标号,即可完成对该图的分解。
例题:poj2186
每头羊有若干崇拜对象,并且崇拜关系可传递,求出被其他所有羊崇拜的羊的个数。
即求最后一个scc所含顶点个数。
1 |
|