数据结构 图的应用通俗语言讲解

最小生成树

Prim 算法 

初始:从顶点集任意选择一个顶点加入集合U和T中开始;其中集合U记录已经遍历过的顶点;建立一棵树T,算法运行完后最终树T就是一棵最小生成树

循环:从遍历顶点发出的边中选择一条边。(这里很重要,算法是从当前顶点到达其他顶点的边选择的)

        这条边有以下3个条件:

                (1)权值最小

                (2)发出这条边的顶点必须是属于U的(即属于遍历过的)

                (3)这条边不属于T中 (即还没有被加入生成树中)

        并将选择的边加入T中,及其到达的顶点也加入U和T中

结束:当所有顶点都加入到T中      

分析:算法遍历每一个顶点以及该顶点到其余顶点的边O(|v|^2)

Kruskal 算法

初始:从最小权值的边开始;集合E记录所有未被加入T的边;建立一棵树T仅包含所有顶点(意义同上)

循环:从未被加入T中的边中选择一条边。

        这条边有以下3个条件:

                (1)权值最小

                (2)此边不能构成回路

                (3)这条边不属于T中

        并将选择的边加入T中,更新E

结束:已经加入了N-1条边到T中

分析:算法每次遍历一条最小权值的边,采用堆结构存储时间复杂度能达到O(eloge)

Dijkstra算法

初始:从源点开始作为当前顶点,定义一个数组A记录从源点到其他顶点的最短路径初始化∞无穷(即不可到达),定义一个集合B初始化为{V0}记录已遍历的结点

循环:对于当前顶点V,(若小于当前记录的最短路径) 则更新V到其他顶点路径长度

            再从数组A选择一条val值最小的顶点(即到源点V0最短的顶点),并把这个顶点作为当前顶点V,进入下一个循环

结束:当所有顶点遍历完,即B包含所有结点后结束

注意:对于遍历过的顶点,也即相当于 已经求得到达该顶点的最短路径

Floyd算法

原理:遍历每一个顶点作为中转站

初始:初始时和图邻接矩阵状态一样(每一个元素相同)若没有中转站 path的值就是路径权值

循环:算法是一个三重循环

           最外层循环:对于每一个当前顶点Vk,将V作为中转站

                内部两层循环:遍历整个图的i和j

                        对于如果 条件 V[i][j] > V[i][k] + V[k][j] //也就是i通过k到达j的路径长度更短

                                               则更新V[i][j]为更小值

                                                且更新path[i][j] = path[k][j]  记录中转站是k

结束:所有顶点遍历完

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值