【图】最小生成树问题——prim普利姆算法和kruskal克洛斯卡尔算法

图是一种常见的高级数据结构,其中最小生成树也是图中的一个重要问题板块,我们先来说一下几个基本概念,懂的可以直接跳过:
1、连通图:没有方向且每两点之间都有一条线段直接连接。
2、强连通图:有方向且每两点之间都有两条线段双向连接。
3、生成树:每个顶点至少有一条线段与它连接且所有顶点同处一棵树中。
4、最小生成树:权值之和最小的生成树。
我们今天要解决的问题是如何构造一棵最小生成树,我们先看克洛斯卡尔kruskal算法。

克洛斯卡尔kruskal算法

我们先看流程图

Created with Raphaël 2.3.0 算法开始 选择权值最小的边 判断两端点 是否在同一 棵树中,不 是则连接 算法结束 yes no

如果您没有明白,请看下面的示意图
【图】最小生成树问题——prim普利姆算法和kruskal克洛斯卡尔算法_第1张图片
虚线代表已连接【图】最小生成树问题——prim普利姆算法和kruskal克洛斯卡尔算法_第2张图片
【图】最小生成树问题——prim普利姆算法和kruskal克洛斯卡尔算法_第3张图片
【图】最小生成树问题——prim普利姆算法和kruskal克洛斯卡尔算法_第4张图片
此时权值最小的边是3,但他的两点已处于同一树,所以忽略。
【图】最小生成树问题——prim普利姆算法和kruskal克洛斯卡尔算法_第5张图片
打叉的边不满足条件,被忽略,最后得到的最小生成树如下图:
【图】最小生成树问题——prim普利姆算法和kruskal克洛斯卡尔算法_第6张图片
这课生成树权值为8,算法即结束。

普利姆prim算法

这个算法是基于点的,而克洛斯卡尔算法是基于线的,我们先看流程图

Created with Raphaël 2.3.0 算法开始 选定一个点直至 所有点已选完 判断此点未连接的点 钟权值最小的边两端点 是否在同一棵树中,不 是则连接 算法结束 yes no

就如:
【图】最小生成树问题——prim普利姆算法和kruskal克洛斯卡尔算法_第7张图片
虚线表示已选或已读
【图】最小生成树问题——prim普利姆算法和kruskal克洛斯卡尔算法_第8张图片
蓝色代表当前选的线段

【图】最小生成树问题——prim普利姆算法和kruskal克洛斯卡尔算法_第9张图片
【图】最小生成树问题——prim普利姆算法和kruskal克洛斯卡尔算法_第10张图片
【图】最小生成树问题——prim普利姆算法和kruskal克洛斯卡尔算法_第11张图片
最后依然得到权值为8的生成树【图】最小生成树问题——prim普利姆算法和kruskal克洛斯卡尔算法_第12张图片

你可能感兴趣的:(数据结构与STL,算法,c++,图论,数据结构)