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

典型的图应用问题

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

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

四个经典算法

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. Android开发之ActionBar

    使用微信APP的小伙伴对于微信的ActionBar一定有印象,今天就带领大家一起实现以下这个效果. 第一步打开我们的开发工具,这里我使用的是Eclipse+ADT插件,然后创建我们的工程,这里选择An ...

  2. ArrayList迭代修改抛出ConcurrentModificationException

    extends:http://www.cnblogs.com/dolphin0520/p/3933551.html Iterator<Integer> iterator = list.it ...

  3. Java虚拟机五 堆的参数配置

    堆空间是Java进程的重要组成部分,几乎所有的应用相关的内存空间都和堆有关. 1.最大堆和初始堆的设置 当Java程序启动时,虚拟机就会分配一块初始堆空间,使用参数 -Xms 指定这块空间的大小.一般 ...

  4. phantomjs试玩

    简单来说,phantomjs就是一个运行在node上的webkit内核,支持DOM渲染,css选择器,Canvas,SVG等,在浏览器上能做的事情,理论上,phantomjs 都能模拟做到. phan ...

  5. Git - 忽略Xcode工程中UserInterfaceState.xcuserstate文件的问题

    一.在同 .Git目录下创建.gitignore文件.在文件中加入如下内容: *.xcuserstate project.xcworkspace xcuserdata UserInterfaceSta ...

  6. Python - 3MySQL 数据库连接

    Python3 MySQL 数据库连接 本文我们为大家介绍 Python3 使用 PyMySQL 连接数据库,并实现简单的增删改查. 什么是 PyMySQL? PyMySQL 是在 Python3.x ...

  7. Scala实现乘法口诀

    object Test4 {  def main(args: Array[String]) {    for (i <- 1 to 9; j <- 1 to 9 if (j <= i ...

  8. 原生JS实现全选,反选

    无样式,比较丑 <!DOCTYPE html><html><head><meta charset="UTF-8"><title ...

  9. FZU2110 Star【计算几何】

    Overpower often go to the playground with classmates. They play and chat on the playground. One day, ...

  10. PHP快速入门

    1.表单 <form action="processorder.php" method="post"> 表单的第一行,action的意思是说,提交表 ...