图的最优化问题:最小生成树、最短路径

典型的图应用问题

无向连通加权图的最小生成树

有向/无向加权图的最短路径

四个经典算法

Kruskal算法、Prim算法---------------最小生成树

Dijkstra算法、Floyd算法-------------最短路径

最小生成树的概念:

G=(V,E):无向连通加权图

C(e)或C(v,w): 边e=(v,w)的耗费(Cost)

若S=(V,T)是G的一棵生成树(T是树边集),那么, S的边长之和称作生成树S的耗费C(S)

耗费C(S)达到最小值的生成树S,称为G的最小耗费生成树,也称最小生成树(MinimumSpanningTree)

即C(S)≤C(S') (S'是图G的任一生成树)

注意:最小生成树可能不唯一

Kruskal算法

算法思想: 按长度从小到大的依次把边加进生成树,若添加某边后形成了回路,就舍弃这条边

反复如此,直到选出n-1条边,便得到最小生成树.。

通俗来讲,该算法很简单。

步骤:

1.在空白处画出与原图一模一样的结点位置。(只画结点,权不需要,结点的位置要一模一样)。

2.按权画边。从权值最小的开始,如图,从4开始,草图就连A-B,到权值5,就连B-F,到权值6,此时就会发现,如果连接A-F,那么A-B-F就会构成一个完整的回路(从任意一点出发可以回到原点。)。因此,就要舍去权值6,即边A-F不可连接。。。。。依次按权大小画其他边。直到最后一个结点。

Kruskal算法伪程序形式

void  Kruskal(***) //***表示函数要求的参数

{  int et=0;           //et用于记录选中的边数

置树边集T为空;

while(et<n-1)               //n是图中的顶点数

{ 从G中选出当前最短边(v,w);

if(添此边于T中,不使生成树产生回路)

{ 把(v,w)加进T;et++;}

else  舍弃(v,w);

}

}

实现方法分析:

子树合并法描述和示例

描述:

Kruskal算法的子树合并法描述形式:

方法一:

void  Kruskal(***) //***表示函数要求的参数

{  int et=0;

每个顶点自成一个集合,并指定集合名;

while(et<n-1)

{ 从G中选出当前最短边(v,w);

找到v所在的集合名i,和w所在的集合名j;

if(i!=j)

{  把(v,w)加进T;  et++;

将集合i与集合j合并成一个集合k;     }

}

}

方法二:

void  Kruskal(***) //***表示函数要求的参数

{  int et=0;

每个顶点一个集合,并指定集合名 ;

while(et<n-1)

{ 从G中选出当前最短边(v,w);

if(v和w不在同一子树中)

{ 把(v,w)加进T;et++;

将v所在的子树与w所在的子树合并成一棵子树;

}

}

}

结论:无论是按权画边法,还是子树合并法都是可以找出最小生成树,但是个人认为按权画边法比较容易理解。

23最小生成树之Kruskal算法的更多相关文章

  1. 最小生成树的Kruskal算法实现

    最近在复习数据结构,所以想起了之前做的一个最小生成树算法.用Kruskal算法实现的,结合堆排序可以复习回顾数据结构.现在写出来与大家分享. 最小生成树算法思想:书上说的是在一给定的无向图G = (V ...

  2. 数据结构与算法--最小生成树之Kruskal算法

    数据结构与算法--最小生成树之Kruskal算法 上一节介绍了Prim算法,接着来看Kruskal算法. 我们知道Prim算法是从某个顶点开始,从现有树周围的所有邻边中选出权值最小的那条加入到MST中 ...

  3. 邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)

    matrix.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include < ...

  4. HDU1875——畅通工程再续(最小生成树:Kruskal算法)

    畅通工程再续 Description相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当 ...

  5. 最小生成树的Kruskal算法

        库鲁斯卡尔(Kruskal)算法是一种按照连通网中边的权值递增的顺序构造最小生成树的方法.Kruskal算法的基本思想是:假设连通网G=(V,E),令最小生成树的初始状态为只有n个顶点而无边的 ...

  6. 算法学习记录-图——最小生成树之Kruskal算法

    之前的Prim算法是基于顶点查找的算法,而Kruskal则是从边入手. 通俗的讲:就是希望通过 边的权值大小 来寻找最小生成树.(所有的边称为边集合,最小生成树形成的过程中的顶点集合称为W) 选取边集 ...

  7. 图论之最小生成树之Kruskal算法

    Kruskal算法,又称作为加边法,是配合并查集实现的. 图示: 如图,这是一个带权值无向图我们要求它的最小生成树. 首先,我们发现在1的所有边上,连到3的边的边权值最小,所以加上这条边. 然后在3上 ...

  8. 【最小生成树之Kruskal算法】

    看完之后推荐再看一看[最小生成树之Prim算法]-C++ 定义:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.最小生成树可以用kr ...

  9. 【转载】最小生成树之Kruskal算法

    给定一个无向图,如果它任意两个顶点都联通并且是一棵树,那么我们就称之为生成树(Spanning Tree).如果是带权值的无向图,那么权值之和最小的生成树,我们就称之为最小生成树(MST, Minim ...

随机推荐

  1. Protobuf的安装使用

    date: 2018-10-12  18:59:13 版权归属原作者,本位转自:https://www.cnblogs.com/autyinjing/p/6495103.html 1. 是什么? Go ...

  2. asp.net 实现pdf、swf等文档的浏览

    一.pdf的浏览 可以借助于pdf.js插件完成,使用pdf.js的好处是不需要安装额外的插件(比如flash),是纯web的解决方案.插件的下载链接:http://mozilla.github.io ...

  3. dhroid - Perference

    SharedPreferences 是我们开发android使用很多的工具通常我们是这样使用的 SharedPreferences share=getSharedPreferences("n ...

  4. iOS - ShareSDK第三方分享(图文和视频)和登录

    由于近期工作需要自己抽时间搞了一下第三方分享,这里使用的是shareSDK的第三方,在使用的过程中有一些心得和体会,特在此和大家分享一下~ 1.在经过将近一周时间的开发,终于搞定ios分享了. 2.由 ...

  5. parameter/argument

    根据网上一些资料,对parameter和argument的区别,做如下的简单说明.1. parameter是指函数定义中参数,而argument指的是函数调用时的实际参数.2. 简略描述为:param ...

  6. ELK之在windows安装filebeat收集日志

    登录官方网站下载filebeat的windows客户端 https://www.elastic.co/downloads/beats 下载压缩包,无需解压 修改配置文件filebeat.yml 其余设 ...

  7. 使用find命令按条件查找多个文件并且拷贝至指定目录

    命令格式如下 find / \( -name "*.war" -o -name "*.jar" \) | xargs -i cp {} ${wardir} 当需 ...

  8. 51nod 1126 - 求递推序列的第N项 - [找规律]

    题目链接:https://cn.vjudge.net/problem/51Nod-1126 有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + ...

  9. HDU 6008 - Worried School

    Worried School Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  10. JS "eval智能" 工厂模式

    <script> var Shop = function () { this.name = function () { document.write("商店的名字 <br/ ...