从A开始,A作为定点,找到与A相连并且未被处理(不在顶点集合中)的进行处理,找到权值最小的并加入集合,A-C[7]、A-G[2]、A-B[5],最小的是A-G[2],所以把G加入集合,这里是有A-G的连接的。

然后把A、G作为顶点,找到与A、G相连未被处理的进行处理,A-C[7]、A-B[5]、G-E[4]、G-B[3]、G-F[6],最小的是G-B[3],把B加入集合,

直到全部遍历完成!

代码

package Algorithm.prim;import java.util.Arrays;public class PrimAlgorihm {public static void main(String[] args) {char data [] = new char[]{'A','B','C','D','E','F','G'};int verxs = data.length;int weight [][] = new int[][]{{10000,5,7,10000,10000,10000,2},{5,10000,10000,9,10000,10000,3},{7,10000,10000,10000,8,10000,1},{10000,9,10000,10000,10000,4,1},{10000,10000,8,10000,10000,5,4},{10000,10000,10000,4,5,10000,6},{2,3,10000,10000,4,6,10000},};MGraph mGraph = new MGraph(verxs);MinTree minTree = new MinTree();minTree.createGraph(mGraph,verxs,data,weight);minTree.showGraph(mGraph);//测试普里姆算法minTree.prim(mGraph,6);}
}//创建最小生成树 ->
class MinTree{//创建图的邻接矩阵/**** @param graph 图对象* @param verxs 顶点个数* @param data  各个顶点的值* @param weight 图的邻接矩阵*/public void createGraph(MGraph graph, int verxs, char [] data, int weight [][]){int i,j;for (i = 0; i < verxs; i++) {graph.data[i] = data[i];for (j = 0; j < verxs; j++){graph.weight[i][j] = weight[i][j];}}}//显示图的邻接矩阵public void  showGraph(MGraph graph){for (int [] link : graph.weight){System.out.println(Arrays.toString(link));}}//编写prim算法,得到最小生成树/**** @param graph 图* @param v 从图的哪个顶点开始生产*/public void prim(MGraph graph, int v){//visited[] 标记顶点是否被访问过,默认都为0int visited [] = new int[graph.verxs];//把当前节点标记为以访问visited[v] = 1;//用h1和h2记录两个顶点的下标int h1 = -1;int h2 = -1;int minWeight = 10000;//将minWeight先初始化为一个大数,后面遍历过程中会被替换for (int k = 0; k < graph.verxs -1; k++) {//因为有graph.verxs顶点,普里姆算法结束后,有graph.verxs-1边//这个是确定每一次生成的子图,和哪个节点的距离最近//就是把所有的节点都给遍历了,所有的线都遍历一遍,找到与当前顶点相连的未被访问过的for (int i = 0; i < graph.verxs; i++) {//i节点表示被访问过的节点for (int j = 0; j < graph.verxs; j++) {//j节点表示未被访问过的节点if (visited[i] == 1 && visited[j] == 0 && graph.weight[i][j] < minWeight){//替换minWeight(寻找已经访问过的节点和未访问过的节点之间的权值最小的)minWeight = graph.weight[i][j];h1 = i;h2 = j;}}}//找到一条边是最小的System.out.println("边 <" + graph.data[h1]+","+graph.data[h2]+"> 权值:" + minWeight);//把当前节点标记为已经访问过visited[h2] = 1;//重置minWeightminWeight = 10000;}}
}
class MGraph{int verxs; //图的节点个数char[] data;//保存节点数据int[][] weight;//存放边,邻接矩阵public MGraph(int verxs) {this.verxs = verxs;data = new char[verxs];weight = new int[verxs][verxs];}}

算法 - 普里姆算法(修路问题求解)相关推荐

  1. 用c语言描述普里姆算法和克鲁斯卡尔算法,克鲁斯卡尔算法+普里姆算法 详解

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

  2. 最小生成树(克鲁斯卡尔算法 普里姆算法)

    最小生成树是处理图结构中,简化图的算法:即删除一些边使得图得以简化,但应保证图中任意点都是相连通的.形成的最小生成树应该使得从顶点遍历时走过边的权值和最小.(有n个节点,则最小生成树的边数应为n-1) ...

  3. 最小生成树:克鲁斯卡尔算法+普里姆算法

    目录 一.最小生成树 二.克鲁斯卡尔算法 1.思路 2.示例 3.C语言代码 三.普里姆算法 1.思路 2.C语言代码 一.最小生成树 一棵最小生成树需要满足哪些条件呢? 不存在回路 对于具有n个顶点 ...

  4. 最小生成树算法——普里姆算法

    普里姆算法 假设G=(V,E)是一个具有n个顶点的连通网,T=(U,TE)是G的最小生成树,其中U是T的顶点集,TE是T的边集,U和TE的初始值为空.算法过程: 首先从V中任取一个顶点(假定v1),将 ...

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

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

  6. 学渣都能看懂的-最小生成树Prim算法(普里姆算法)

    最小生成树问题:要将图中的n个点连通,即任意两点之间都存在路径.要使连通图中各边的权值之和最小. 例: 最小生成树所要掌握的点: ·求出最小生成树权值之和 ·保存最小生成树的各边 使各边权值之和最短需 ...

  7. 我所知道的十大常用算法之普里姆算法(最小生成树)

    前言需求 今天我们学习的是普里姆算法,我们还是从一个场景里引入看看 有7个村庄(A, B, C, D, E, F, G) ,现在需要修路把7个村庄连通 1.各个村庄的距离用边线表示(权) ,比如 A ...

  8. 两种构造最小生成树的算法(普里姆算法,克鲁斯卡尔算法)

    (一)普里姆算法 普里姆算法求最小生成树:从生成树中只有一个顶点开始,到定点全部进入生成数为止: 2.克鲁斯卡尔算法. 思想:将所有边按其权值从小到大排一遍,从小到大依次选取边,加入最小生成树中,若加 ...

  9. 克鲁斯卡尔算法 与 普里姆算法

    克鲁斯卡尔算法 设G=(V,E)是具有n个顶点的连通网,T=(U,TE)是其最小生成树. 1.选取权值最小的边(Vi,Vj),若边(Vi,Vj)加入到TE后形成回路,则舍弃该边,否则将该边加入到TE中 ...

最新文章

  1. gin获取路径中的参数
  2. 重磅!第三届「星斗奖」榜单正式发布!
  3. c语言规定 函数返回值6,C语言六函数.ppt
  4. 3.odoo13之跟着官网做项目/实例(模型关联,模型类模型表的关联)
  5. Oracle 返回结果集 sys_refcursor
  6. java类结构工具_java类层次结构图工具
  7. linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(oracle基础配置_04)
  8. python小屋_Python小屋——Python语言基础(一)
  9. 图像处理之基础---图像高效不失真缩放既卷积应用
  10. 微软为一人收购一公司?破解索尼程序、写黑客小说,看他彪悍的程序人生!...
  11. iOS JSPatch 热修复使用
  12. 海量数据挖掘MMDS week2: 频繁项集挖掘 Apriori算法的改进:基于hash的方法
  13. poj 1958 Strange Towers of Hanoi dp,需要仔细读题
  14. Access 操作必须使用可更新查询
  15. 快看这里,如何卸载windows11自动更新下载的文件还你C盘空间
  16. 在r中弄方差分析表_R语言 | 方差分析(上)
  17. ffmpeg截取jpg图_使用ffmpeg进行视频封面截取
  18. Pytest + Allure 测试报告定制
  19. Python个人项目2 --------青蛙旅行项目
  20. 服务名无效。 请键入 NET HELPMSG 2185 以获得更多的帮助。

热门文章

  1. 可访问性不一致的原因与解决方法
  2. UCScript——C++集成脚本
  3. nutch2.1分布式抓取
  4. [剑指offer]面试题第[68-2]题[Leetcode][第236题][JAVA][二叉搜索树的最近公共祖先][递归]
  5. [Leedcode][JAVA][第1431题][拥有糖果最多的孩子][暴力][六一儿童节]
  6. bower overrides 配置
  7. 如何在CSDN博客中的所贴的代码进行【代码块】显示
  8. libxml2交叉编译问题及解决办法
  9. MySQL安装错误: unknown option '--skip-federated'
  10. VirtualCopy()操作I/O口 物理地址为什么要移8位