每日一贴,今天的内容症结字为最小生成树算法

MST(minimum spanning tree)即最小生成树算法,经典的有两个,这里分析一下kruskal算法。关于另外的一个prim算法,本blog也将分析。
何谓最小生成树呢?大家知道树就是每一个结点可以互相到达,并且没有环的一种数据结构,这里就不多分析了,何谓最小生成树呢?就是从一个图中选取若干条边,这些边使得每一个结点之间可以互相到达,最症结就是,选取的这些边的权值之和是最小的。
下面看一个图

那么这个图的最小生成树就是

下面我们分析一下kruskal算法的基本思想,然后再对照算法看看下面那棵最小生成树是如何生成的
1.从图中选取权值最小的一条边将权值加到sum中(sum记录最小生成树的边的总权值)
2.继承图里头选取权值次小的边加到sum,但是当前继承选边有个条件,即所选的边与前面选的边不能形成环(因为这是求最小生成树嘛)
3.重复2步骤直到选了|V|-1条边(V代表图的结点总数),为什么呢?因为一棵树的的边数比结点数少1嘛
这里的症结是如何判断它是不是有环(建议读者去看看本blog的对于并查集的讲解,或者去看别人的(呵呵))
这里简单举个例子分析一下比如说图a中,我们先选了3-6这条边,于是设置parent[6]=3,然后又选4-6这条边
因为6的父亲是3,比4小,于是我们设置parent[4]=3,假设我们要选3-4这条边,由于初始化父亲的时候设置的parent[3]=3本身,这个时候我们发明parent[3]=3,parent[4]也等于3,于是判定这形成了环(很奇妙吧。),当然这只是简单分析,建议没学过并查集的读者,先去看看并查集再看本blog。
好了,算法的基本思想就是这样,其实就是贪心嘛,当初我们看看上图的最小生成树是如何生成的

1.先对边进行排序(sort函数很快嘛。)
2.选1-3这条边,再选4-6这条边,再选2-5这条边,再选3-6这条边,再选1-4或者2-3,选1-4的时候,我们发明形成了环(1-3-6-4-1),于是不选他,选2-3。终究选了6-1=5条边。

最后贴下模板

每日一道理
生命,是一场漫长的棋局。这盘棋没有猎猎西风,没有四起狼烟,只有在取舍和进退中抉择。只有像棋中的小卒那样,勇往直前,毫不退缩沿着沟沟坎坎的人生之路,艰难而执着的求索,前进,才会谱写人生最壮丽的强者之歌。
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
int parent[101];
struct Edge
{int u,v;int len;
};
struct Graph
{int vexnum;int vecnum;Edge edge[10001];
}G;
bool cmp(Edge a,Edge b)
{return a.len<b.len;
}
void Unitparent(Graph G)
{int i;for(i=1;i<=G.vexnum;i++)parent[i] = i;
}
int Find(int x)
{int i=x,tem;while(i!=parent[i])//找到祖先i = parent[i];while(i!=x)//非递归压缩路径{tem = parent[x];parent[x] = i;x = tem;}return i;
}
void Unionset(int x,int y)
{int x1 = Find(x),y1 = Find(y);if(x1>y1) parent[x] = y1;else parent[y] = x1;
}
int kruskal(Graph G)
{int i;int sum_weight = 0;int num = 0;//已选边的数目sort(G.edge,G.edge+G.vecnum,cmp);Unitparent(G);//初始化全部顶点的祖先for(i=0;i<G.vecnum;i++){if(Find(G.edge[i].u)!=Find(G.edge[i].v))//没有形成环{sum_weight += G.edge[i].len;num++;//所选边数+1Unionset(G.edge[i].u,G.edge[i].v);//并查集的合并操作if(num>=G.vexnum-1) break;}}if(num<G.vexnum-1) return 0;//算选的边数比结点数-1小,此图确定不是连通图咯,最小生成树不存在。return sum_weight;
}

推荐题目

http://acm.hdu.edu.cn/showproblem.php?pid=1863

文章结束给大家分享下程序员的一些笑话语录: 自从有了Photoshop,我再也不相信照片了!(没有Photoshop的年代,胶片照片年代做假的也不少,那时候都相信假的!)

最小生成树算法MST_kruskal算法相关推荐

  1. 生成树的概念,最小生成树Prim算法 Kruskal算法

    求解最小生成树可以用Prim算法 Kruskal算法

  2. C++编程练习(10)----“图的最小生成树“(Prim算法、Kruskal算法)

    1.Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 2.Kruskal 算法 直接寻找最小权值的边来构建最小生成树. 比较: Kruskal 算法主要是针对边来展开,边数 ...

  3. 数据结构图之二(最小生成树--克鲁斯卡尔算法)

    [1]克鲁斯卡尔算法 普里姆算法是以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 克鲁斯卡尔算法是直接以边为目标去构建. 因为权值是在边上,直接去找最小权值的边来构建生成树也是很自然的想 ...

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

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

  5. C语言Prims求最小生成树MST的算法(附完整源码)

    C语言Prims求最小生成树MST的算法 C语言Prims求最小生成树MST的算法完整源码(定义,实现,main函数测试) C语言Prims求最小生成树MST的算法完整源码(定义,实现,main函数测 ...

  6. #1098 : 最小生成树二·Kruscal算法

    #1098 : 最小生成树二·Kruscal算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用 ...

  7. #1097 : 最小生成树一·Prim算法

    #1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可 ...

  8. 数据结构——最小生成树之prime算法(与最短路径之迪杰斯特拉算法很像)

    最小生成树之prime算法 ***最小生成树:一个连通图的生成树中,所有边的权值加起来最小的生成树:称为最小生成树: [简介]:Prime算法可在加权连通图里搜索最小生成树.即:所有边的权值之和为最小 ...

  9. 图的最小生成树和最短路径算法思路总结(Prim,Kruskal,Dijkstra,Floyd)

    带权无向图->最小生成树算法->Prim算法: 思路: 首先,我们先设置两个集合,U_{}:一个用来放最小生成树的顶点,T_{}:一个用来放最小生成树的边.选取最开始的点V_0,将V_0放 ...

最新文章

  1. html js文本框文字列出,js实现文本框中输入文字页面中div层同步获取文本框内容的方法...
  2. IntelliJ IDEA 添加本地xsd文件
  3. 软件测试的测什么,软件测试人员应具备哪些能力?
  4. 三十八、判断服务是否运行及定位问题
  5. textview 背景变形_西安昆明池桁架舞台背景搭建欢迎致电
  6. Winform中实现点击按钮弹窗输入密码验证通过后执行相应逻辑
  7. anaconda中的python如何进行关联分析_Anaconda、Miniconda、Conda、pip的相互关系
  8. 终于有人把卷积神经网络(CNN)讲明白了
  9. init_MUTEX被废除
  10. 51社区房间怎么用挂号器_冬季艾灸时,房间怎么排烟?
  11. 虚拟机下Linux单击变双击问题的解决办法
  12. 淘宝数据魔方技术架构解析【转】
  13. 我与学霸的距离计算机,你与学霸的距离,可能就差本笔记
  14. 拉格朗日乘子法(Lagrange Multiplier) 和KKT条件
  15. Android入门第十四篇之画图
  16. Spark 开发环境搭建(1)IDEA Gradle的安装部署、使用
  17. OpenCv基础知识(入门)
  18. 单词 2012-01-19
  19. 攻防世界 转轮机加密
  20. 数据结构实验1.2—高精度计算PI值(西工大)

热门文章

  1. BusinessFrameWork
  2. 甲骨文第四财季SAAS和PAAS收入增长66%
  3. mipi屏在内核可以显示logo但是u-boot无法显示的问题【转】
  4. rsync+innotify实现实时同步
  5. 操作系统原理之磁盘调度
  6. Linq学习from let where子句
  7. 部署在IIS上的网站如何调试
  8. 【干货分享】dos命令大全
  9. BZOJ4571:[SCOI2016]美味——题解
  10. Netty深入浅出(一)入门