抽象类

import java.util.List;public abstract class Adjacency<V> {/** 总权重 */protected int totalWeight;/** 顶点的父亲 */protected int[] parent;/** 保存顶点的添加顺序 */protected List<Integer> list;/*** prim* @param startingVertex 开始的顶点*/public abstract void prim(int startingVertex);/*** 打印结果*/public abstract void print();
}

邻接表

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class AdjacencyList<V> extends Adjacency<V> {public class Edge {/** 起始顶点 */public int start;/** 结束顶点 */public int end;/** 权重 */public int weight;public Edge(int start, int end, int weight) {this.start = start;this.end = end;this.weight = weight;}}/** 存储顶点 */public List<V> vertices = new ArrayList<>();/** 邻接表 */public List<List<Edge>> neighbors = new ArrayList<>();public AdjacencyList(V[] vertices, int[][] edges) {createWeightedGraph(Arrays.asList(vertices), edges);}/*** 构建邻接线性表*/private void createWeightedGraph(List<V> vertices, int[][] edges) {this.vertices = vertices;for(int i = 0; i < vertices.size(); i++) {neighbors.add(new ArrayList<>());}for(int i = 0; i < edges.length; i++) {neighbors.get(edges[i][0]).add(new Edge(edges[i][0], edges[i][1], edges[i][2]));}}@Overridepublic void prim(int startingVertex) {//权重double[] cost = new double[vertices.size()];for(int i = 0; i < cost.length; i++) {//初始化cost[i] = Double.POSITIVE_INFINITY;}//初始化是0cost[startingVertex] = 0;//父节点this.parent = new int[vertices.size()];parent[startingVertex] = -1;//树的总权值this.totalWeight = 0;//保存符合条件的顶点。this.list = new ArrayList<>();//找出最小权重while(list.size() < vertices.size()) {//当前顶点int u = -1;double currentMinCost = Double.POSITIVE_INFINITY;for(int i = 0; i < vertices.size(); i++) {if(!list.contains(i) && cost[i] < currentMinCost) {currentMinCost = cost[i];u = i;}}//增添新的顶点list.add(u);//把当前权值增加给数的总权值totalWeight += cost[u];//在待查找的顶点调整顶点相邻边的cost数组for(Edge e : neighbors.get(u)) {if(!list.contains(e.end) && cost[e.end] > e.weight) {cost[e.end] = e.weight;parent[e.end] = u;}}}}@Overridepublic void print() {System.out.println("total weight is: " + super.totalWeight);System.out.print("查找顺序为:");for(int i : super.list) {System.out.print(" " + vertices.get(i));}System.out.println("\n节点之间的关系为: ");int[] parent = super.parent;for(int i = 0; i < parent.length; i++) {if(parent[i] != -1) {System.out.println(vertices.get(i) + "---" + vertices.get(parent[i]));}}}}

邻接矩阵

import java.util.ArrayList;public class AdjacencyMatrix<V> extends Adjacency<V> {private String[] vertices;private int[][] matrix;public AdjacencyMatrix(String[] vertices, int[][] matrix) {this.vertices = vertices;this.matrix = matrix;}@Overridepublic void prim(int startingVertex) {//权重double[] cost = new double[vertices.length];for(int i = 0; i < cost.length; i++) {//初始化cost[i] = Double.POSITIVE_INFINITY;}//初始化是0cost[startingVertex] = 0;//父节点this.parent = new int[vertices.length];parent[startingVertex] = -1;//树的总权值this.totalWeight = 0;//保存符合条件的顶点。this.list = new ArrayList<>();//找出最小权重while(list.size() < vertices.length) {//当前顶点int u = -1;double currentMinCost = Double.POSITIVE_INFINITY;for(int i = 0; i < vertices.length; i++) {if(!list.contains(i) && cost[i] < currentMinCost) {currentMinCost = cost[i];u = i;}}//增添新的顶点list.add(u);//把当前权值增加给数的总权值totalWeight += cost[u];//在待查找的顶点调整顶点相邻边的cost数组for(int e = 0; e < matrix[u].length; e++) {if(!list.contains(e) && cost[e] > matrix[u][e]) {cost[e] = matrix[u][e];parent[e] = u;}}}}@Overridepublic void print() {System.out.println("total weight is: " + super.totalWeight);System.out.print("查找顺序为:");for(int i : super.list) {System.out.print(" " + vertices[i]);}System.out.println("\n节点之间的关系为: ");int[] parent = super.parent;for(int i = 0; i < parent.length; i++) {if(parent[i] != -1) {System.out.println(vertices[i] + "---" + vertices[parent[i]]);}}}
}

测试代码

public class TestPrim {public static void main(String[] args) {//测试用例随意写的String[] vertices = {"北京", "上海", "广州", "杭州", "长沙", "武汉", "南京"};System.out.println("----------邻接表----------");int[][] edges = {{0, 1, 7807}, {0, 3, 1331}, {0, 5, 2097},{1, 0, 7807}, {1, 2, 381}, {1, 3, 1267},{2, 1, 381}, {2, 3, 1015}, {2, 4, 1663},{3, 0, 1331}, {3, 1, 1267}, {3, 2, 1015}, {3, 4, 599}, {3, 5, 1003},{4, 2, 1663}, {4, 3, 599}, {4, 5, 533},{5, 0, 2097}, {5, 3, 1003}, {5, 4, 533}, {5, 6, 983},{6, 5, 983}};Adjacency<String> adjacencyList = new AdjacencyList<>(vertices, edges);adjacencyList.prim(0);adjacencyList.print();System.out.println("----------邻接矩阵----------");int[][] matrix = {{0, 7807, 0, 1331, 0, 2097, 0},      //北京{7870, 0, 381, 1267, 0, 0, 0},       //上海{0, 381, 0, 1015, 1663, 0, 0},       //广州{1331, 1267, 1015, 0, 599, 1003, 0}, //杭州{0, 0, 1663, 599, 0, 533, 0},        //长沙{2097, 0, 0, 1003, 533, 0, 983},     //武汉{0, 0, 0, 0, 0, 983, 0}              //南京};Adjacency<String> adjacencyMatrix = new AdjacencyMatrix<>(vertices, matrix);adjacencyMatrix.prim(0);adjacencyList.print();}
}

输出结果

----------邻接表----------
total weight is: 4842
查找顺序为: 北京 杭州 长沙 武汉 南京 广州 上海
节点之间的关系为:
上海---广州
广州---杭州
杭州---北京
长沙---杭州
武汉---长沙
南京---武汉
----------邻接矩阵----------
total weight is: 4842
查找顺序为: 北京 杭州 长沙 武汉 南京 广州 上海
节点之间的关系为:
上海---广州
广州---杭州
杭州---北京
长沙---杭州
武汉---长沙
南京---武汉

最小生成树之prim算法(邻接表和邻接矩阵)相关推荐

  1. 最小生成树(Prim算法,Kruskal算法)

    最小生成树 假设要在n个城市之间建立通信联络网,则连通n个城市只需要n-1条线路.这时,自然各 考虑这样一个问题,如何在最节省经费的前提下建立这个通信网. 在每两个城市之间都可设置一条线路,相应地都要 ...

  2. C++编程练习(10)----“图的最小生成树“(Prim算法、Kruskal算法)

    1.Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 2.Kruskal 算法 直接寻找最小权值的边来构建最小生成树. 比较: Kruskal 算法主要是针对边来展开,边数 ...

  3. Prim算法(JAVA实现-邻接矩阵)

    简介 最小生成树介绍 Prim 算法本质就是就是求最小生成树问题, 最小生成树(Minimum Cost Spanning Tree),简称MST. 给定一个带权的无向连通图,如何选取一棵生成树,使树 ...

  4. #1097 : 最小生成树一·Prim算法

    #1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可 ...

  5. 数据结构笔记(二十九)--最小生成树(prim算法思想)

    最小生成树(prim算法思想) 一.预知概念 直达:两顶点直接相连接 路径:两顶点之间可以有其他顶点,但最终两顶点是能够连接的 假如我们有四台电脑,怎样连接才能保证这四台电脑两两相互通信组成局域网呢? ...

  6. 离散实验一 油管铺设 (求最小生成树的Prim算法的实际应用)

    实验一 油管铺设 2018.11.06于CSDN释放 详见GitHub: https://github.com/DolorHunter/PrimAlgorithm 实验准备 最小生成树问题,求最小生成 ...

  7. 最小生成树的prim算法(java)

    /** * 最小生成树的prim算法 * @author liuy */ public class Prim { public static void prim(int num, float[][] ...

  8. 最小生成树之 Prim算法 Kruskal算法

    1 描述 问题:修建一个连接各个小区与煤气供应站点之间的管道,使得造价成本最低,即构造一颗最小生成树.但是如何求解? 对应模型:树结构,生成树,最小生成树 2 prim算法实例 基本思想:在满足如下条 ...

  9. prim最小生成树算法 邻接表+STL实现

    一.预备知识 优先队列 二.代码: #include<iostream> #include<list> #include<vector> #include<m ...

最新文章

  1. 项目部署不到tomcat中的原因和解决方法
  2. beanUtils操作bean的属性
  3. Java关键字介绍之final
  4. Kubernetes — 容器设计模式
  5. Disucz!高级幻灯片制作
  6. centos 查找nginx_centos7 nginx安装/启动/进程状态/杀掉进程
  7. Linux安装solr
  8. C语言 —— sprintf()函数
  9. DL之NN:基于(sklearn自带手写数字图片识别数据集)+自定义NN类(三层64→100→10)实现97.5%准确率
  10. javascript取随机数_查缺补漏一些 Javascript 的小技巧笔记
  11. 记录yarn被攻击的解决办法
  12. React之事件处理
  13. gcc2.95.3安装过程
  14. 点云能量预测:KPConv点云输入方式
  15. 解码器输出PSNR为0表示什么
  16. 沪江swf文件怎么打开_沪江课件播放器swf player_flash swf播放器_沪江swf播放器播放不了...
  17. [iOS] HealthKit 睡眠分析
  18. 使用代理ccproxy设置outlook2013 收QQ邮箱(IMAP-SMTP方式)
  19. 微信公众平台开发【发送消息】被动回复消息
  20. 最新花椒回放下载方法-马赛克视频助手

热门文章

  1. 程序猿 Windows 10 日常使用软件记录
  2. mysql 更新返回响应值_在MySQL中更新返回“匹配的行数:1已更改:0警告:0”
  3. python--Tkinter学习笔记之Button
  4. 文件预览:Markdown文件预览
  5. 如何快速的开发一个完整的直播app,附答案
  6. 全网最详细虚拟机网络之桥接模式(小白也能看)
  7. Quartus Prime 原理图输入以及仿真流程
  8. 制作initrd.img
  9. Docker原理和基本使用
  10. 做好这四件小事,让移动支付安全无忧!