1. 强连通分量(strongly connected components,SCC) 对于无向图来说,只有连通分量(connected components)的概念。强连通分量是针对有向图来说的。 SCC(u) = set of nodes that are reachable from u and have a path back to u. 那么,该如何找到一个图中的所有强连通分量呢? 1.1 使用BFS找到SCC(u) 但是,...
如果从某个无向图里去掉某个顶点以及这个顶点所有的边,如果此时图中连通分量的个数增加了,那么定义这个顶点为“关节点”。更通俗地解释,可以说如果拿走这个顶点,这幅图就破成了好几块,因此这个点好比“关节”,没有了关节整个结构也就破坏掉了。 后来上网搜了资料后,我才知道原来这就是割点。 描述: 解决这个问...
简介: 给定一个有向图,如果每一条边u->v代表一根水管,定义能从u流向v的最大水流量。那么选定起点s和终点t,如果让水从s流入,从t流出,最多能达到多少流量而不挤爆水管? 图示: Capacity是容量的意思,那么我们用C(u, v)来表示u->v这条边,也就是u流向v的最大流量。 下面是一张容量图: Ford-Fulkerson方法...
简单的来说可以这么理解:如果存在一条边a->b,那么a顶点就在b的前面。 下面我们通过例子来看看拓扑排序的过程,确定所有的顶点中,谁排在谁的前面。 图示: 下面是一个图,符合上面所提出的三个条件,因此可以进行拓扑排序。我们关注每个顶点的入度,表示这个顶点被指向的次数。 每次我们都选出一个入度为0的顶点,因为...
《数据结构与算法分析:C语言描述》复习——第九章“图论”——单源带权最短路径问题 2014.07.04 18:32 简介: 给定一个有向图,边的权值可能各不相同(不包含负权值)。给定一个起点s,找出起点到所有顶点的最短路径距离。 描述: 这就是Dijkstra算法的用武之处了。
本次使用Prim算法来解决这个问题。Prim算法的思想是两点:BFS与贪婪。 我们从一个顶点出发,把这个顶点对应的边加入到优先队列中。既然是优先队列,当然是边的权值短的优先。 每一轮我们从优先队列中取出一条边u->v,u已经被访问过(选出的这条边权值必然是目前最短的),如果v未被访问过,那么标记v,并把从v出发的...
本次使用Kruskal算法来解决这个问题。 如果有n个顶点的话,我们需要n-1条边来拼成一棵树。 Kruskal算法的基本思路,是每次拼上一条边,看看是否会造成一个环,如果会形成环则放弃这条边。 怎么保证拼成的那棵树权值最小呢?把所有边按权值由小到大排序。从小到大一个个试就可以了。
给定一个有向图,你可以认为每条边长度都是1(所以叫无权值)。下面的算法可以求出从特定的起点到终点的最短路径长度。 描述: 从起点出发,根据当前顶点出发的边进行广度优先搜索,直至找到终点即可。如果搜索结束了仍然没有找到终点,那么起点无法到达终点。
给定一个带权图(有向无向皆可),找出每个顶点到其他所有顶点的最短距离。 描述: 此处介绍O(n^3)级别的Floyd算法,只需要用三层循环的简单代码就完成所有最短距离的计算。唯一需要注意的,就是三层循环里i、j、k的摆放顺序。 代码非常简单,所以无需多作解释了。