连通图的最小生成树

生成树定义:

无向连通图G的极小连通子图,称为它的生成树。(n个顶点,n-1条边)

考虑一下下面这个图

上图是一个完全图,它的生成树不是唯一的,我们列出最特殊的两种情况

上面2个图都是第一个完全图的生成树,但是2者是完全不同的。

按照深度优先遍历生成的生成树,称为深度优先生成树

按照广度优先遍历生成的生成树,称为广度优先生成树

非连通图的生成森林,概念比较简单,无非就是非连通图的极大连通子图和生成树的概念叠加

最小生成树

图G是带权的无向连通图,生成树上个边权值之和称为生成树的代价,代价最小的生成树称为最小生成树。

最小生成树的生成算法

Prim算法

现有连通图G=(V, E),其最小连通图TG=(TV, TE)。

初始状态下:V = {V0, V1, V2 ... Vn}; TV = {}

从V当中任选一顶点,插入TV,V = {V0, V1, V2 ... Vn}; TV = {V0}

找连接TV和V-TV这两个集合的权值最小的边,插入TE,并把该边2顶点当中原本不属于TV的顶点加入TV;

重复上一步骤

知道V = TV

下面是java实现,首先我们需要修改一下之前的生成图的代码,我们生成了一棵7个顶点的完全图,每一条边的权值是100以内的随机数。

Graph graph = new Graph();

String nodeNames[] = {"aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg"};

for (String s : nodeNames) {

graph.nodes.add(new Node(s));

}

graph.arcs = new int[nodeNames.length][nodeNames.length];

Random ra = new Random();

for (int i = 0; i < graph.nodes.size(); i ++){

for (int j = 0; j < graph.nodes.size(); j ++){

if (i != j){

graph.arcs[i][j] = ra.nextInt(100) + 1;

}

}

}

然后是最小生成树的Prim算法实现,解释一下,首先创建一个二维数组表示边,把空间都分配好,只等着往里面填数就行。然后是一个TreeMap对象,来保存顶点,之所以用TreeMap,是为了保证新图的顶点顺序和原图是一致的。剩下的基本就是跟前面算法描述的差不多,大家对着看就行,没什么太难的地方。

public Graph getMinTree(){

int newArcs[][] = new int[this.nodes.size()][this.nodes.size()];

Map newNodes = new TreeMap();

newNodes.put(0, this.nodes.get(0));

while(newNodes.size() != this.nodes.size()){

int minWeight = 99999;

int minI = -1;

int minJ = -1;

for(int i : newNodes.keySet()){

for (int j = 0; j < this.nodes.size(); j ++){

if (i != j && !newNodes.containsKey(j)){

if (this.arcs[i][j] < minWeight){

minWeight = this.arcs[i][j];

minI = i;

minJ = j;

}

}

}

}

newNodes.put(minJ, this.nodes.get(minJ));

newArcs[minI][minJ] = minWeight;

newArcs[minJ][minI] = minWeight;

}

Graph res = new Graph();

res.arcs = newArcs;

res.nodes.addAll(newNodes.values());

return res;

}

下面有一次测试的输出,2个图,分别是原图的所有权值信息,另一个是最小生成树的权值信息

然后还可以用连通图的dfs算法检查一下。

Kruskal算法

先将所有边按照权值,从小到大排序

依次访问各边,如果生成回路,则舍弃,否则加入生成树,同时将该边的另一顶点加入生成树

直到所有顶点被加入

java实现,省略。

java带权连通图上最小权边,连通图最小生成树的算法及实现相关推荐

  1. Java数据结构与算法:无向图,有向图,带权图,图的遍历,最小生成树

    文章目录 无向图 有向图 带权图 图的遍历 广度优先遍历 深度优先遍历 最小生成树 无向图 前面了解到树是有单一根结点的非线性结构,图(graph)也是一种非线性结构,其中的结点可以与许多其他的结点相 ...

  2. 最小权点覆盖集 与 最大权独立集

    最小权点覆盖集 一.定义 什么是点覆盖集呢?就是图中所有点的一个子集,首先他是一个点集,然后图中所有边的两个端点的其中一个都在这个点集中,就是说这个点集中包含了所有边的至少一个端点,这个点集就覆盖了所 ...

  3. HOJ 2739 The Chinese Postman Problem 带权有向图上的中国邮路问题

    [题目大意]  带权有向图上的中国邮路问题:一名邮递员需要经过每条有向边至少一次,最后回到出发点,一条边多次经过权值要累加,问最小总权值是多少.(2 <= N <= 100, 1 < ...

  4. 带权二分图匹配(最小费用最大流) 8.2牛客暑期多校训练营五 E

    E.room | 时间限制:1 秒 | 内存限制:256M Nowcoder University has 4n students and n dormitories ( Four students ...

  5. HDU 1853 HDU 3488【有向环最小权值覆盖问题 】带权二分图匹配 KM算法

    HDU 1853 & HDU 3488[有向环最小权值覆盖问题 ]最小费用最大流 In the kingdom of Henryy, there are N (2 <= N <= ...

  6. HOJ 2739 网络流【带权有向图上的中国邮路问题】

    [带权有向图上的中国邮路问题] #include<cstring> #include<cstdio> #include<algorithm> #include< ...

  7. POJ-2195 Going Home 最小权值匹配

    题意:给定一个网格图,图上有一些人要到一些房子当中去,人和房子的数量一样多,人和房子的曼哈顿距离作为行走的开销,问所有人走到房子中的最小开销. 解法:将人和房子之间两两之间建立带权边,权值为曼哈顿距离 ...

  8. 小A与欧拉路 (树加边求最小权值欧拉路+树的直径)

    链接:https://ac.nowcoder.com/acm/contest/369/C 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言2621 ...

  9. pku The Windy's KM最小权匹配 or 最小费用最大流

    http://poj.org/problem?id=3686 题意: 给定n个玩具,有m个车间,给出每个玩具在每个车间的加工所需的时间mat[i][j]表示第i个玩具在第j个车间加工所需的时间,规顶只 ...

最新文章

  1. 洛谷P3252 [JLOI2012]树
  2. 20T数据、百万奖金,同济和武大摘得开放数据创新应用大赛桂冠!
  3. 纯css实现毛玻璃效果
  4. hdu4020简单想法题
  5. windows环境下安装scrapy框架报错问题--最快捷有效的解决方案
  6. pandas 或者字段值_pandas用法总结
  7. 无人驾驶属于计算机科学吗,无人驾驶的车辆如何识别物体?科研笔记,原来车辆的眼睛是它...
  8. android 将图片路径转二进制,将图像转换为二进制图像中的android
  9. python matplotlib模块教程_Python中的Matplotlib模块入门教程
  10. 6.828 - lab3
  11. java并发编程实战看哪几章,附源代码
  12. 计算机模拟专业委员会,中国化工学会过程模拟及仿真专业委员会成立
  13. 自动驾驶技术(5)视觉与激光雷达对比
  14. 天镜漏洞扫描报告HTML转Excel格式Python脚本
  15. 坤宝德万达打造命运共同体万达茂天樾之夜.时光发声全国巡回演唱会南宁站圆满结束
  16. css中滑轮中是如何做的,横向的网页如何实现鼠标滑轮横向移动?_html/css_WEB-ITnose...
  17. 通信安全重重考验,阿里云通信如何打造企业级“安全感”?
  18. RLC振荡原理与RC Snubber吸收电路
  19. linux硬件时间与系统时间不同步,Linux系统时钟和硬件时钟不一致
  20. 铁、髓鞘和大脑:神经影像遇见神经生物学

热门文章

  1. 定时器中断实验 编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器。
  2. arduinowin7_win7系统64位系统安装Arduino uno R2 驱动的方法
  3. mysql 5.1版本无innodb trx_MySQL 5.7: Innodb 事务子系统优化-阿里云开发者社区
  4. GoLand中的指针操作 * 和
  5. Spring boot 项目目录结构详解
  6. 四种依恋类型_依恋关系的研究
  7. Python小白的数学建模课-17.条件最短路径算法
  8. Python入门基础篇(一)列表,详细实用,简单易懂!!!!
  9. 山东鲁能轨道智能巡检机器人_温湿度传感器在轨道巡检机器人中的应用
  10. 百度贴吧发帖软件_贴吧自动发帖软件