1)算法的基本思想:

前面我们学习过Prim算法,他是一种以某个节点出发,按权值递增的次序选择合适的边来构造最小生成树的方法,他的时间复杂度为O(n2),与顶点有关,而与边无边,所以适合求边稠密的图的生成树。

算法构造一颗最小生成树的过程如下(母图基于Prim算法部分的无向图):

2)算法的描述:

在图中任取一个顶点K作为开始点,令U={k},W=V-U,其中V为图中所有顶点集,然后找一个顶点在U中,另一个顶点在W中的边中最短的一条,找到后,将该边作为最小生成树的树边保存起来,并将该边顶点全部加入U集合中,并从W中删去这些顶点,然后重新调整U中顶点到W中顶点的距离, 使之保持最小,再重复此过程,直到W为空集止。

假设G=(V,E)是一个具有n个顶点的带权无向连通图,T= (U,TE)是G的最小生成树,其中U是T的顶点集,TE是T的边集,则构造最小生成树的过程如下:

(1) 置U的初值等于V,TE的初值为空集;

(2) 按权值从小到大的顺序依次选取图G中的边,若选取的边未使生成树T形成回路,则加入TE;若选取的边使生成树T形成回路,则将其舍弃。循环执行(2),直到TE中包含(n-1)条边为止。

3)C语言描述:

为实现克鲁斯卡尔算法需要设置一维辅助数组E,按权值从小到大的顺序存放图的边,数组的下标取值从0到e-1(e为图G边的数目)。

假设数组E存放图G中的所有边,且边已按权值从小到大的顺序排列。n为图G的顶点个数,e为图G的边数。克鲁斯卡尔算法如下:

#define MAXE <最大边数>

#define MAXV <最大顶点数>

typedef struct

{

int vex1;                     //边的起始顶点

int vex2;                      //边的终止顶点

int weight;                    //边的权值

}Edge;

Voidkruskal(Edge E[],int n,int e)

{ inti,j,m1,m2,sn1,sn2,k;

int vset[MAXV];

for(i=0;i<n;i++)        //初始化辅助数组

vset[i]=i;

k=1;        //表示当前构造最小生成树的第k条边,初值为1

j=0;                   //E中边的下标,初值为0

while(k<e)            //生成的边数小于e时继续循环

{ ml=E[j].vex1;m2=E[j].vex2;//取一条边的两个邻接点

sn1=vset[m1];sn2=vset[m2];

//分别得到两个顶点所属的集合编号

if(sn1!=sn2)

//两顶点分属于不同的集合,该边是最小生成树的一条边

{ printf(“(m1,m2):%d\n”,E[j].weight);

k++;                //生成边数增l

for(i=0;i<n;i++)    //两个集合统一编号

if (vset[i]=sn2)      //集合编号为sn2的改为sn1

vset[i]=sn1;

}

j++;                  //扫描下一条边

}

}

4)C语言完整实现

#defineMAXE 11

#defineMAXV 10

#include"stdio.h"

typedefstruct

{

intvex1;                     //边的起始顶点

intvex2;                      //边的终止顶点

intweight;                    //边的权值

}Edge;

void kruskal(Edge E[],int n,int e)

{ int i,j,m1,m2,sn1,sn2,k;

intvset[MAXV];

for(i=1;i<=n;i++)        //初始化辅助数组

vset[i]=i;

k=1;        //表示当前构造最小生成树的第k条边,初值为1

j=0;                   //E中边的下标,初值为0

while(k < e)            //生成的边数小于e时继续循环

{

m1=E[j].vex1;

m2=E[j].vex2;//取一条边的两个邻接点

sn1=vset[m1];

sn2=vset[m2];

//分别得到两个顶点所属的集合编号

if(sn1!=sn2)

//两顶点分属于不同的集合,该边是最小生成树的一条边

{

printf("(v%d,v%d):%d\n",m1,m2,E[j].weight);

k++;                //生成边数增l

if(k>=6)  break;

for(i=1;i<=n;i++)    //两个集合统一编号

if(vset[i]==sn2)  //集合编号为sn2的改为sn1

vset[i]=sn1;

}//if

j++;                  //扫描下一条边

}//while

}//kruskal

intmain()

{

EdgeE[MAXE];

intnume,numn;

//printf("输入边数和顶数:\n");

//scanf("%d%d",&nume,&numn);

nume=10;

numn=6;

printf("请输入各边及对应的的权值(起始顶点 终止顶点 权值)\n");

/*

for(inti=0;i<nume;i++)

scanf("%d%d%d",E[i].vex1,E[i].vex2,E[i].weight);

*/

//在这里对输入的数据进行排序,达到假设的要求,即:假设数组E存放图G中的

//所有边,且边已按权值从小到大的顺序排列

E[9].vex1=1;

E[9].vex2=2;

E[9].weight=6;

E[0].vex1=1;

E[0].vex2=3;

E[0].weight=1;

E[4].vex1=1;

E[4].vex2=4;

E[4].weight=5;

E[6].vex1=2;

E[6].vex2=3;

E[6].weight=5;

E[2].vex1=2;

E[2].vex2=5;

E[2].weight=3;

E[8].vex1=1;

E[8].vex2=2;

E[8].weight=6;

E[5].vex1=3;

E[5].vex2=4;

E[5].weight=5;

E[7].vex1=3;

E[7].vex2=5;

E[7].weight=6;

E[3].vex1=3;

E[3].vex2=6;

E[3].weight=4;

E[1].vex1=4;

E[1].vex2=6;

E[1].weight=2;

kruskal(E,numn,nume);

}

5)以上我们只是作抛砖引玉。比如节点的数量,边的数量,都可以根据实际情况来增减。

最小生成树在实际生活中主要用来解决生活中的优化问题。比如在几个大城市间修建路,如何修才能省时省力等。

7、最小生成树,克鲁斯卡尔(Kruskal)算法相关推荐

  1. 克鲁斯卡尔算法c语言,最小生成树-克鲁斯卡尔(Kruskal)算法

    1. 克鲁斯卡尔算法简介 克鲁斯卡尔算法是一种用来寻找最小生成树的算法(用来求加权连通图的最小生成树的算法).在剩下的所有未选取的边中,找最小边,如果和已选取的边构成回路,则放弃,选取次小边. 而具体 ...

  2. 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)

    目录 一.最小生成树简介 二.普里姆算法(Prim) 1.原理 2.存储 2-1.图顶点和权: 2-3. 最小生成树: 3.Prim()函数 3-1.新顶点入树 3-2.保留最小权 3-3. 找到最小 ...

  3. 对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的边。说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度

    对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的 边.说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度

  4. 算法:通过克鲁斯卡尔(Kruskal)算法,求出图的最小生成树

    之前我给大家分享过用普利姆(Prim)算法来求出图的最小生成树(点我去看看),今天我再给大家分享一个也是求图的最小生成树的克鲁斯卡尔(Kruskal)算法 克鲁斯卡尔(Kruskal)算法,就相当于先 ...

  5. 【算法】克鲁斯卡尔 (Kruskal) 算法

    目录 1.概述 2.代码实现 2.1.并查集 2.2.邻接矩阵存储图 2.3.邻接表存储图 2.4.测试代码 3.应用 本文参考: <数据结构教程>第 5 版 李春葆 主编 1.概述 (1 ...

  6. 算法之克鲁斯卡尔(Kruskal)算法

    克鲁斯卡尔(Kruskal)算法 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法. 基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路 具体做法:首先 ...

  7. 普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法

    图是一种基础又重要的数据结构,图的生成树是图的一个极小连通子图.最小生成树是无向连通网的所有生成树中边的权值之和最小的一棵生成树.求图的最小生成树可以牵引出很多经典的题目,例如在N个城市之间建立通讯网 ...

  8. Java实现之克鲁斯卡尔(Kruskal)算法

    一.问题引入 1.问题引入 1)某城市新增7个站点(A,B,C,D,E,F,G),现在需要修路把7个站点连通 2)各个站点的距离用边线表示(权),比如A-B距离12公里 3)问:如何修路保证各个站点都 ...

  9. 【数据结构与算法】克鲁斯卡尔(Kruskal)算法

    一,应用场景 公交站问题 1)某城市新增7个站点(A,B,C,D,E,F,G),现在需要修路把7个站点连通 2)各个站点的距离用边线表示(权),比如 A - B距离12公里 3)问:如何修路保证各个站 ...

最新文章

  1. tensorflow cuda 对应版本
  2. 一文了解自然语言处理神经史(上)
  3. 超长的十六进制数转换为八进制
  4. 循环GridView
  5. Python(4):条件控制
  6. C# 并行运算方法简析
  7. 用双边模式,让生意立刻火爆
  8. RHCSA学习笔记-基础操作命令
  9. SWT FontFieldEditor使用
  10. java免安装版配置_Java环境变量一键配置
  11. 浅谈协方差矩阵 再谈协方差矩阵之主成分分析
  12. 阿里云安装kubernetes-UI报错endpoints \kubernetes-dashboard\ not found解决方法
  13. 决策支持系统是什么?
  14. zabbix监控的快速部署
  15. HTML的简单页面加密代码
  16. c语言间隔符号的作用,C语言教学(二)常见的符号
  17. 谷歌浏览器旧版本下载地址
  18. 【防骗】来电显示号码竟可任意修改
  19. html文件的基本结构包括不包括哪部分,Html基本结构
  20. 宽带服务器光信号亮红灯,宽带的光信号一直闪红灯是为什么

热门文章

  1. uniapp中修改input里的字体颜色
  2. D. For Gamers. By Gamers.
  3. Flannel网络原理(转载)
  4. UG NX 曲面造型设计思路
  5. MKD3用法之一构造虚假WIFI热点
  6. 基于ssm的招标投标系统
  7. NC17134 Symmetric Matrix(dp+数学)
  8. gtk界面学习——显示中文提示框
  9. 微信小程序 自定义头部导航栏
  10. 第三章 卡耐基如何战胜自我 一 驱逐烦恼的技巧