引子:

假设整个无向图中的点记为A,最小生成树中的点记为T,其他点记为Q(也就是Q= A-T),T与Q相连的边记为B

算法构造过程:

1、初始化:首先将一个点(随意一个)加入最小生成树中

2、在所有Q中找到一条与T中的某个点直接相连的并且权值最小的边B以及对应的点,加入最小生成树

3、重复以上过程,直到T=A。

</pre><pre name="code" class="java">package minTree;import java.util.ArrayList;
import java.util.List;public class MinTreeTest1 {public static void main(String[] args) {MinTree t = new MinTree(10);t.addVertex("v1");t.addVertex("v2");t.addVertex("v3");t.addVertex("v4");t.addVertex("v5");t.addVertex("v6");t.addEdge(0, 1, 6);t.addEdge(0, 2, 1);t.addEdge(0, 3, 5);t.addEdge(0, 4, 2000000);t.addEdge(0, 5, 2000000);t.addEdge(1, 2, 5);t.addEdge(1, 3, 2000000);t.addEdge(1, 4, 3);t.addEdge(1, 5, 2000000);t.addEdge(2, 3, 5);t.addEdge(2, 4, 6);t.addEdge(2, 5, 4);t.addEdge(3, 4, 2000000);t.addEdge(3, 5, 2);t.addEdge(4, 5, 6);t.printMatrix();int[][] a = t.buildMinTree2();System.out.println();int size = a.length;for(int i = 0; i < size; i++){for(int k = 0; k < size; k++){System.out.print(a[i][k]+"; ");}System.out.println();}}
}class MinTree {private int[][] matrix = null;private Vertex[] vertexList = null;private int size = 0;private int maxSize = 20;public MinTree(int maxSize) {this.maxSize = maxSize;this.matrix = new int[maxSize][maxSize];this.vertexList = new Vertex[maxSize];}//增加顶点public void addVertex(String label) {if (isFull()) {throw new ArrayIndexOutOfBoundsException("满了!!");}vertexList[size] = new Vertex(label, -1);size++;}//增加边public void addEdge(int start, int end, int weigth) {if (start > size - 1 || end > size - 1) {throw new ArrayIndexOutOfBoundsException("没有这个元素");}if (start == end) {return;}this.matrix[start][end] = weigth;this.matrix[end][start] = weigth;}public boolean isFull() {return size == maxSize;}/*** 顶点类* @author LiangYH**/class Vertex {String label;int weigth;boolean isWired;public Vertex(String label, int weigth) {this.label = label;this.weigth = weigth;this.isWired = false;}public void printVertex() {System.out.println("label = " + label + "; weigth = " + weigth);}}//最大权值private static final int FLAG_WEIGTH = 10000;/*** 生成最小生成树* @return 最小生成树的邻接矩阵*/public int[][] buildMinTree2() {//存储最小生成树的邻接矩阵int [][] dyadic = new int[size][size];//存储最小生成树的顶点List<Integer> treeList = new ArrayList<>();//权值最小的点和边List<DoubleVertex> tempList = new ArrayList<>();//从第一个开始treeList.add(0);vertexList[0].isWired = true;//每次循环,最小生成树将增加一个顶点for (int j = 0; j < size; j++) {//找到将要加入最小生成树中的点和边int treeVertexIndex = -1;for (int i = 0; i < treeList.size(); i++) {treeVertexIndex = treeList.get(i);//每次循环,会找到最小生成树中的点到其他点权值最小的边以及对应的权重int tempWeigth = FLAG_WEIGTH;int indexFlag = -1;for (int k = 0; k < size; k++) {int tempWeigth2 = matrix[treeVertexIndex][k];if (tempWeigth2 > 0 && tempWeigth2 < tempWeigth&& !vertexList[k].isWired) {tempWeigth = tempWeigth2;indexFlag = k;}}if (tempWeigth != FLAG_WEIGTH) {DoubleVertex dou = new DoubleVertex(treeVertexIndex,indexFlag, tempWeigth);tempList.add(dou);}}//找到最小权值中的最小权值DoubleVertex tempDoubleVertex = new DoubleVertex(-1, -1,FLAG_WEIGTH);for (int i = 0; i < tempList.size(); i++) {if (tempList.get(i).weigth < tempDoubleVertex.weigth) {tempDoubleVertex = tempList.get(i);}}if (tempDoubleVertex.weigth != FLAG_WEIGTH) {//加入最小生成树treeList.add(tempDoubleVertex.outTreeIndex);//设置为已经连入最小生成树vertexList[tempDoubleVertex.outTreeIndex].isWired = true;//打印System.out.println(vertexList[tempDoubleVertex.inTreeIndex].label+ "; in Index = "+ tempDoubleVertex.inTreeIndex+"; "+ vertexList[tempDoubleVertex.outTreeIndex].label+"; out Index = "+ tempDoubleVertex.outTreeIndex + "; weigth = "+ tempDoubleVertex.weigth);//维护最小生成树的邻接矩阵dyadic[tempDoubleVertex.inTreeIndex][tempDoubleVertex.outTreeIndex] = tempDoubleVertex.weigth;dyadic[tempDoubleVertex.outTreeIndex][tempDoubleVertex.inTreeIndex] = tempDoubleVertex.weigth;//清空tempList.clear();}}//还原for(int i = 0; i < size; i++){vertexList[i].isWired = false;}return dyadic;}//打印邻接矩阵public void printMatrix() {System.out.println();for (int i = 0; i < size; i++) {for (int k = 0; k < size; k++) {System.out.print(matrix[i][k] + "; ");}System.out.println();}}/*** 记录两个顶点以及他们相连的权重* @author admin**/class DoubleVertex {//最小生成树中的点int inTreeIndex;//非最小生成树中的点int outTreeIndex;//权重int weigth;public DoubleVertex(int inTreeIndex, int outTreeIndex, int weigth) {this.inTreeIndex = inTreeIndex;this.outTreeIndex = outTreeIndex;this.weigth = weigth;}}
}

无向图的最小生成树(prim算法)相关推荐

  1. C++ 实现无向图的最小生成树Prim算法(附完整代码)

    实现Prim算法,需设置两个辅助一维数组lowcost和closevertex. 其中lowcost用来保存集合V-U中各顶点与集合U中各顶点构成的边中具有最小权值的边的权值: 数组closevert ...

  2. [Java学习] 最小生成树——Prim算法

    文章目录 最小生成树 Prim算法流程 应用实例 求最小生成树 最小生成树 百度百科上对于最小生成树的定义是这样的:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结 ...

  3. D-OJ刷题日记:使用邻接矩阵实现最小生成树Prim算法 题目编号:1135

    理解: [理解prim算法本质--让一棵小树逐渐长大] Prim算法:又称为加边法,即每次选择最小权值的边加入到生成树中,然后再更新权值,如此反复,保证每次最优来达到最优解. Prim算法生成树用的是 ...

  4. 西南科技大学OJ题 求最小生成树(Prim算法)1075

    求最小生成树(Prim算法) 1000(ms) 10000(kb) 2256 / 4495 Tags: 生成树 求出给定无向带权图的最小生成树.图的定点为字符型,权值为不超过100的整形.在提示中已经 ...

  5. 最小生成树-Prim算法详解(含全部代码)

    目录 适用条件 测试所用图 算法详解 Prim算法代码 全部代码 实验结果 适用条件 加权连通图 测试所用图 所用原图及生成过程 其中,(a) 为原图,圆圈里面是节点的名称,边上的数字是边的权值.由实 ...

  6. 最小生成树Prim算法Java版

    最小生成树Prim算法Java版 算法描述: 在一个加权连通图中,顶点集合V,边集合为E 任意选出一个点作为初始顶点,标记为visit,计算所有与之相连接的点的距离,选择距离最短的,标记visit. ...

  7. 最小生成树 - Prim算法

    最小生成树 - Prim算法 思路: 采用 贪心策略,每次选取连通块外延的最短边和对应的点放入连通块,再更新新的连通块外延的边.连通部分逐渐扩大,最后将整个图连通起来,并且边长之和最小. 时间复杂度: ...

  8. 【数据结构】最小生成树 Prim算法 Kruskal算法

    最小生成树应用场景: 假设以下场景,有一块木板,板上钉上一些钉子,这些钉子可以由一些细绳连接起来.假设每个钉子可以通过一根或者多根细绳连接起来,那么一定存在这样得情况,即用最少的细绳把所有的钉子连接起 ...

  9. 【数据结构】最小生成树(Prim算法,普里姆算法,普利姆)、最短路径(Dijkstra算法,迪杰斯特拉算法,单源最短路径)

    文章目录 前置问题 问题解答 一.基础概念:最小生成树的定义和性质 (1)最小生成树(Minimal Spanning Tree)的定义 (2)最小生成树(MST)的性质 二.如何利用MST性质寻找最 ...

  10. 最小生成树—Prim算法

    我们要讨论的问题是如何在一个无向图中找到它的最小生成树,虽然这个问题对有向图也有意义,但是处理起来更麻烦. 一个无向图 G 的最小生成树就是连接 G 上所有顶点的边构成的树,且这些边的总权值最低.当且 ...

最新文章

  1. PyTorch称霸学界,TensorFlow固守业界,ML框架之争将走向何方?
  2. SpringBoot使用mybatis
  3. Linux关闭selinux
  4. java安装pydev找不到_为什么安装成功也重启了,但是在window-preferences里找不到PyDev...
  5. LabView学习笔记(六):while循环与for循环
  6. bootstrap模态框弹窗导致页面左移
  7. 英文论文写作小贴士(2)
  8. 【地球科学】常用的地理投影坐标系介绍(笔记)
  9. 好书推荐 | 2020 年读过的这些好书,建议收藏!
  10. ios查看苹果app的下载量,日活,销售情况等相关数据
  11. SIM卡相关知识总结
  12. mac系统中brew下载路径
  13. 企业ERP系统开发总结及建议
  14. ServiceMesh实践与探索
  15. 一个个人收集的好的软件下载站-大眼仔
  16. 全球最大同性交友网站,已经10岁了!
  17. [转载-FLUENT学习]流动仿真计算时湍流模型的选择
  18. supplier java8_关于JAVA8中关于Supplier的个人理解
  19. 《STM32从零开始学习历程》——DMA直接存储区访问理论知识
  20. VS Code本地刷LeetCode,这波在大气层

热门文章

  1. python是用c 写的吗_我能用python写一个c语言出来吗?
  2. 编写程序,计算分段函数的值
  3. LuckyFrame V2.7.2 Beta 发布,一站式自动化测试平台
  4. cmd启动tomcat
  5. 微软正式发布Azure Storage上的静态网站
  6. 组织会议中的“小心思”
  7. NFS服务基本配置及使用
  8. Symfony笔记之--控制器的快捷方法
  9. 开放产品开发(OPD):Archi 汉化工具下载
  10. Windows server 2008 R2 通过策略关闭密码复杂性