链式前向星,kosaraju,Tarjan,Gabow算法的理解,POJ 2186 Popular Cows(强连通分量)

本文介绍了强连通分量的概念及其在有向图中的分类。讲解了链式前向星的数据结构,以及kosaraju、Tarjan和Gabow三种算法的原理和实现,强调了在遍历过程中的关键点和注意事项。
摘要由CSDN通过智能技术生成

今天学习了下强连通分量。:强连通分量一定是图的深搜树的一个子树

主要有kosaraju,Tarjan两种算法

在实际过程中,数据结构选用链式前向星的方法更简单

预备:

DFS可用来判断图中是否有环,展现无向图中的连通分支。
通过DFS,形成一个由多棵深度优先树所组成的深度优先森林。将原先图中的边添加到该森林之后,可以将所有边定义为以下四类:
1.    树边:森林中自带的边(即不在森林生成后,从原先图中添加的边)。
2.    反向边:从某个节点指向祖先的边,包括自己指向自己。非森林自带的边。如果图中存在反向边,则表明存在环。
3.    正向边:从某个节点指向后代的边,非森林自带的边。
4.    交叉边:边的两端点之间没有祖先后代关系,非森林自带的边。


在DFS过程中,可以对任意两点间的边进行分类,对于有向图和无向图,分类情况有所区别。
有向图:
1.    树边:当visit了节点u后,如果边(u, v)存在,且v为WHITE,则该边为树边。
2.    反向边:当visit了节点u后,如果边(u, v)存在,且v为GREY,则该边位反向边。
3.    正向边:当visit了节点u后,如果边(u, v)存在,且v为BLACK,StartTime[u] < StartTime[v] < EndTime[v] < EndTime[u],则边为正向边。
4.    交叉边:当visit了节点u后,如果边(u, v)存在,且v为BLACK,StartTime[v] < EndTime[v] < StartTime[u] < EndTime[u],则边为交叉边。


1.链式前向星


前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,

并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了.


用len[i]来记录所有以i为起点的边在数组中的存储长度.

用head[i]记录以i为边集在数组中的第一个存储位置.

(具体例子看题解)

2.kosaraju的一个粗浅解释:

1遍历原图G,得到每个点的访问结束时间endtime[i](为结束时间为i的点为哪个)

2.遍历转置GT,顺序为从结束时间由大到小,同时记录可到达的就是一个连通分量belong(其中存放的就是I这个结点属于哪个连通分量)

理解:

对于一个图其遍历树的结点必然是之前遍历过的结点(此处遍历树也考虑了不访问的情况),那么从结点回溯回去就相当于从结点尽可能往上走

这样的话就相当于之前的边反向,即可。从大到小选择则是保证从叶子节点开始。

如果我们把求出来的每个强连通分量收缩成一个点,并且用求出每个强连通分量的顺序来标记收缩后的节点,
那么这个顺序其实就是强连通分量收缩成点后形成的有向无环图的拓扑序列。首先,应该明确搜索后的图一定是有向无环图呢?
废话,如果还有环,那么环上的顶点对应的所有原来图上的顶点构成一个强连通分量,而不是构成环上那么多点对应的独自的强连通分量了。
然后就是为什么是拓扑序列,我们在改进分析的时候,不是先选的树不会连通到其他树上(对于反图GT来说),
也就是后选的树没有连通到

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值