贪心算法 - 最小生成树 Prim算法
来源:互联网 发布:风险矩阵法 编辑:程序博客网 时间:2024/05/16 14:39
一个无向带权图G=(V,E),其中n个顶点Vertex,以及连接各个顶点之间的边Edge,可能有些顶点之间没有边,每条边上的权值都是非负值。
生成树:
G的一个子图,包含了所有的Vertex,和部分的Edge。
最小生成树:
所有的生成树中,各条Edge上的权值总和最小的一个。
例子:设计通信网络时,各个城市之间铺设线路,最经济的方案。
最小生成树性质:
G=(V,E),
S是V的真子集,
如果u在S中,v在V-S中,且(u,v)是图的一条边,称之为特殊边,且(u,v)是所有特殊边中最短的,
那么,(u,v)这条边一定在最小生成树中。
Prim算法:
任意指定一个顶点作为起始点,放在S中。
每一步将最短的特殊边放入S中,需要n-1步,即可把所有的其他的点放入S中。算法结束。
对于这个图,Prim算法的过程为:
代码实现如下:
/** * 最小生成树 minimum spanning tree * @author xuefeng * */public class MST {public static final int NOT_REACHED = -1;/** * @param E n*n */public static void prim(int[][] E) {int n = E.length;boolean[] S = new boolean[n];int[] dist = new int[n];int[] prev = new int[n];S[0] = true; // 选取顶点1作为起始点for (int i = 1; i < n; i++) {dist[i] = E[0][i];prev[i] = 0;S[i] = false;}int min = -1, minV = -1;for (int i = 1; i < n; i++) {min = -1;minV = -1;// 选择离S中顶点最近的点for (int j = 1; j < n; j++) {if (!S[j] && dist[j] != -1 && (min == -1 || dist[j] < min)) {min = dist[j];minV = j;}}if (minV == -1)continue;S[minV] = true;// S中多了个点,需要改变S离外面的点的最短距离for (int j = 1; j < n; j++) {if (!S[j] && isReachable(E, minV, j)&& (dist[j] == -1 || E[minV][j] < dist[j])) {dist[j] = E[minV][j];prev[j] = minV;}}// 输出测试结果for (int j = 0; j < n; j++) {if (S[j]) {System.out.print((j + 1) + " ");}}System.out.println();}}private static boolean isReachable(int[][] E, int v1, int v2) {return E[v1][v2] != NOT_REACHED;}public static void main(String[] args) {int[][] E = { { -1, 6, 1, 5, -1, -1 }, { 6, -1, 5, -1, 3, -1 },{ 1, 5, -1, 5, 6, 4 }, { 5, -1, 5, -1, -1, 2 },{ -1, 3, 6, -1, -1, 6 }, { -1, -1, 4, 2, 6, -1 } };prim(E);}}
输出为:
1 3 1 3 6 1 3 4 6 1 2 3 4 6 1 2 3 4 5 6
可由prev数组构造出最小生成树。
算法复杂度为O(n^2)
- 最小生成树Prim算法(贪心算法)
- 贪心算法 - 最小生成树 Prim算法
- 贪心算法 - 最小生成树 Prim算法
- 贪心算法之Prim最小生成树
- 最小生成树prim算法(贪心)
- 最小生成树(MST)Prim算法 贪心算法
- 最小生成树的prim算法贪心正确性的证明
- POJ1258--贪心&最小生成树的prim算法
- 最小生成树的prim算法贪心正确性的证明
- Prim---求最小生成树(贪心算法)
- 贪心法之最小生成树之Prim算法
- 贪心算法 最小生成树prim与单源最短路径dijkstra
- 贪心算法——Prim最小生成树
- 贪心算法之最小生成树(Prim)
- 贪心算法实例(八):最小生成树Prim
- 贪心算法基础之最小生成树prim算法 51nod prim模板
- Prim最小生成树算法
- 最小生成树Prim算法
- struts2 result全局结果集
- Chapter 8 多态
- MobclickAgent——友盟用户分析工具
- shell读取参数,并设置默认值
- 什么是流程控制,如何看懂一个程序
- 贪心算法 - 最小生成树 Prim算法
- 一篇不错的讲解Java异常的文章
- poj2531 Network Saboteur
- VMware虚拟机三种网络模式的区别
- 如何学习---理关系,找异同
- C++ 虚函数表解析
- 缓存设计介绍
- javascript定时器
- 递归显示指定文件夹下面的文件