强连通分量 Kosaraju算法

本文介绍了Kosaraju算法用于查找图的强连通分量,通过两次深度优先搜索(DFS)过程,首先计算节点的完成时间,然后在反向图上按完成时间顺序进行DFS,输出每个DFS树作为强连通分量。在POJ 2186 Popular Cows问题中,该算法被用于判断哪些牛群被视为popular,并解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

强连通分量 Kosaraju算法 

伪代码(摘自Introduction to Algorithm 3rd Edition):

Strongly_connected_components( G )

1. call DFS(G) to compute finishing time u.f for each vertex u

2. compute GT

3. call DFS(GT), but in the main loop of DFS, consider the vertices in order of decreasing u.f

4. output the vertices of each tree in the dfs forest formed in line 3 as a scc


分析:对于图G中的节点a, dfs( a )可求出所有a可达的节点,对于把所有边反向的GT,dfs( a )可求出所有可达a的节点。

集合{a可达}与集合{可达a}的交集就是a属于的scc。

证明:对两个几个交集中任意两点b,c,b与a互相可达,c与a互相可达,所以b与c互相可达。


为了避免集合求交集的操作,如果在执行第3步的时候,所有点都是{a可达},就可以了。

这就是第1步的目的,求出dfs(G)每个节点的完成时间,对于任意节点b,b.f > a.f, 那么b肯定不属于{a可达},因为如果a可达b,那么b一定在a的深搜树中。


POJ 2186 Popular Cows

题目大意:牧场有N头牛,牛可以认为另一头牛popular,求被其他所有牛认为popular的数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值