最小代价生成树
来源:互联网 发布:为什么要用react.js 编辑:程序博客网 时间:2024/05/17 07:14
1、Prim算法
设G=(V,E)是带权的连通图,T=(V’,E’)是正在构造中的最小代价生成树。初始状态下,该树只有一个顶点,没有边,即V’={u0},E’={ },u0是任意选择的顶点。
从初始状态开始,重复以下操作:
寻找一条权值最小的边(u’,v’),u’端点在构造中的生成树上,而v’不在该生成树上,然后将此最小边加入生成树。重复以上操作,直至V=V’。
代码如下:
/** * Prim最小代价生成树 O(n2) * * @param graph * @param k:起点 * @param nearest:保存最小权值边的起点 * @param lowcost:保存最小权值 */ public void Prim(Graph graph, int k, int[] nearest, int[] lowcost) { // 初始化 for (int i = 0; i < nodeNum; i++) { nearest[i] = -1; lowcost[i] = Integer.MAX_VALUE; mark[i] = false; } // 将源点k加入生成树 lowcost[k] = 0; nearest[k] = k; mark[k] = true; for (int i = 0; i < nodeNum; i++) { // 找出最小邻接点 for (Node node = vertex[k].next; node != null; node = node.next) { if (!mark[node.id] && lowcost[node.id] > node.weight) { lowcost[node.id] = node.weight; nearest[node.id] = k;// nearest[end] = start } } int min = Integer.MAX_VALUE; for (int j = 0; j < nodeNum; j++) { if (!mark[j] && lowcost[j] < min) { min = lowcost[j]; k = j;// 重新定义起点为该最小邻接点 } } mark[k] = true;// 将该最小邻接点加入生成树 } }
2、Kruskal算法
设G=(V,E)是带权的连通图,T=(V’,E’)是正在构造中的最小代价生成树。初始状态下,该生成树包含n棵只有根节点的树,即V=V’,E’={ }。
从初始状态,重复以下操作:
在E中选择一条代价最小的边(u,v),若u、v分属于两颗不同的树(若属于同一棵树,则会形成回路),则将边(u,v)加入生成树,否则继续下一条边,直至E’包含n-1条边为止。
借助优先权队列保存所有的边,每次出队列的总是权值最小的边;
借助并查集判断一条边的两个顶点u、v是否分属于两棵不同的子树。
代码如下:
/** * Kruskal最小代价生成树 O(elbe) * * @param queue * @param n */ public void Kruskal(PriorityQueue<EdgeNode> queue, int n) { int k = 0, u, v; UFset ufset = new UFset(); ufset.createUFset(n); System.out.println("最小代价生成树:"); while (k < n - 1 && !queue.isEmpty()) { EdgeNode eNode = queue.poll(); u = ufset.Find(eNode.u); v = ufset.Find(eNode.v); if (u != v) { ufset.Union(u, v); k++; System.out.println(eNode.u + "," + eNode.v + "," + eNode.weight); } } if (k < n - 2) System.out.println("This graph is not connected!"); }
阅读全文
0 0
- 最小代价生成树
- 最小代价生成树
- 最小(代价)生成树
- 算法之路--最小代价生成树
- 最小代价数(最小生成树) Krushal算法
- POJ 1679 The Unique MST 最小代价生成树 次小代价生成树
- POJ1251(基础的最小代价生成树问题)
- 对贪心法求解最小代价生成树的理解
- 普莱姆算法生成最小代价树---java代码
- CCF201412-4 最佳灌溉(最小代价生成树)
- 贪心算法(四)——最小代价生成树
- 最小代价生成树的克鲁斯卡尔算法
- 最小代价树
- 最小代价树
- 最小代价树
- HDU 4126 Genghis Khan the Conqueror(树形dp,MST,破坏原有最小生成树边后的最小生成树代价)
- 最小代价
- 最小代价;;;;
- C# 接口是否可以包含字段
- Oracle 函数function之返回结果集
- [POJ](2485)Highways ---最小生成树(图)
- HTML 你最该知道的几个知识点
- 记一次晋升答辩
- 最小代价生成树
- 阳历以及阳历的闰年
- 深入理解Spring框架(一)
- C#打印条码BarTender SDK
- USACO-Section2.1 Healthy Holsteins
- Java8新特性(拉姆达表达式lambda)
- 当你编码时你在做什么:谈编程的本质(一)状态机
- 廖雪峰《python3 基础教程》读书笔记——第十五十六十七章
- 技术文章 | 循环递归RNN_序列建模套路深(深度学习入门系列之十三)