这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战
前言
数据结构中图是非常常见和重要的一种,可以应用在很多路径计算算法中,比如说蚁群算法
图
相关分类概念
-
连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图。
-
强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连通图。
-
连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数,称为权;权代表着连接连个顶点的代价,称这种连通图叫做连通网。
-
生成树:一个连通图的生成树是指一个连通子图,它含有图中全部n个顶点,但只有足以构成一棵树的n-1条边。一颗有n个顶点的生成树有且仅有n-1条边,如果生成树中再添加一条边,则必定成环。
-
最小生成树:连通图的最小连通子图(有权的无向连通图)
n个顶点,边的数量为n-1
最小生成树算法
prim(普林母)算法
横切边:假设有一条切割线将图分为两部分,那么切割线经过的边叫做横切边
切分定理:最短的横切边必定属于最小生成树
假设G = ( V(顶点) , E(边) )为有权的无向连通图,C (V,E) 为最小生成树
A={} 为最小生成树的边集
执行如下步骤知道 A中的数量为顶点树 - 1并且所有的顶点已存在C中
如上所示
从顶点A开始遍历,穿过AB、AH 两个横切边的切割线将A 和其他顶点分为两部分,AB的权值最小所以AB放入A中,且将顶点A放入C中
BC、AH 两个横切边的切割线将A、B 和其他顶点分为两部分,BC 的权值最小所以 BC 放入A中,且将顶点B放入C中
一直重复上述步骤
注意在重复上述步骤时选择最小的横切边时需要判断横切边的另一个顶点是不是已经在 C 中,也就是说选择这条横切边会不会形成环
prim 算法和求最优解的方式很像,就是将图分为两个部分然后找到连接两个图的最优路径
Kruskal(克鲁斯卡尔)算法
-
按照边权值大小进行正向排序,加入到生成树中,知道生成树中含有V(顶点数) - 1条边为止
-
若加入该边会与生成树形成环则不加入该边