摘要:问题描述:求最小树形图的总权值。即以固定根为起点,沿给定有向边,可以访问到所有的点,并使所构成的边权值之和最小,求这个最小总权值。算法步骤:① 清除自环,输入的时候判断即可② 先判断从固定根开始是否可达所有原图中的点。简单搜索加标记位就可以。如果不可就不用说了,肯定没戏。③ 为除根之外的每个点选定一条最小入边。(记pre [vi]为该边的起点)④判断这个入边集是否存在有向环,如果不存在,我们很容易证明这个集合就是该图的最小树形图,转⑥,否则接⑤。(利用prev数组,枚举为检查过的点作为搜索的起点,做类似DFS的操作)⑤消环。设(u,i,w)表示从u到i的权为w的边。设刚才的有向环缩为新结点ne
阅读全文
摘要:问题描述:求无向连通图G<V, E>最小生成树(MST)。(不知道什么是MST的见Prim算法中的算法依据一栏)算法步骤:本质是贪心。① 将G中的n个顶点看成是n个独立的连通分量,可记为T<V,X>② 每次找当前剩余的权值最小的边,若分属不同的连通分量,则将其加入T③ 重复②,直到所有点连通算法实现:① 取权值最小的边,可使用最小堆或快排。② 判断是否属于同一连通分量,可基于树的父指针表示法中的并查集算法。并查集可以使用重量权衡合并规则和路径压缩进行优化。算法补充:并查集算法:把n个节点分到多个集合,快速查找属于哪个集合,快速合并两个集合的算法。方法是使用森林,同一个集
阅读全文
摘要:问题描述:求最小生成树(MST)。算法步骤:本质是贪心。① 初始集合MST为空.② 由图中任一顶点N开始,将N加入 MST。③ 找出外部顶点中与当前MST顶点相距最短的顶点M和边(M,N),加入MST④ 重复②直至全部节点都加入MST为止算法依据:关于最小生成树:最小生成树是总边权值最小的生成树,一个连通图的生成树是包含所有顶点的极小连通子图,极小连通子图是包含所有顶点的无环连通子图。最小生成树的性质:任取子集U ⊂ V且U≠∅,若u∈U,v∈V-U,且(u,v)在所有U到V-U的边中具有最小权值(又称为轻边),则必有一棵最小生成树包含(u,v)。用反证法易证。算法实现:View Code .
阅读全文
摘要:问题描述:给定一个带权图(可以有负权),求任意两点间的最短路。算法过程:本质是一个动态规划的过程。G中n个顶点的编号为1到n。令c[i][j][k]表示从i 到j 的最短路径的长度,其中中间顶点不超过k。如果G中包含边<i, j>,则c[i][j][0] =边<i, j> 的长度;否则c[i][j][0]= +∞。c[i][j][n] 则是从i 到j 的最短路径的长度。对于任意的k>0,通过分析可以得到:中间顶点不超过k的i到j的最短路径有两种可能:该路径含或不含中间顶点k。若不含,则该路径长度应为c[i][j[k-1],否则长度为c[i][k][k-1] +c
阅读全文
摘要:问题描述:【单源最短路径问题】给定一个带权图(无负权)和一个指定的顶点V0,求出V0到所有其他各点的最短路径。算法过程: 本质也是个贪心算法。①所有顶点划分为两个集合S和D。初始S集合只有点V0,V0对应的距离值为0;剩余的顶点皆在D集合中,如果存在边<V0,Vi>,则Vi的距离值为此边的权值,否则Vi的距离值为∞②从D中选择离源距离值最小的顶点Vm加入到S集合③同时以Vm 作为中间顶点,更新距离值④重复②③直到D为空(或最小值也为∞)具体实现: 1.普通实现:更适合稠密图int min[N];//记录当前最小距离bool flag[N];//标志是否在集合S中int pre[N]
阅读全文