Prim算法解决修路问题

2023-11-20

普里姆算法(Prim算法):

图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。

普里姆算法和Kruskal算法的区别
两者都是贪心策略追求最优解,但是普里姆算法讲究全局优先,Kruskal算法讲究的是局部优先.

普里姆算法思路

1).输入:一个加权连通图,其中顶点集合为V边集合为E;

2).初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;

3).重复下列操作,直到Vnew = V,代表所有顶点都已经连接起来了:

a.在集合E中选取权值最小的边<u, v>,其中**u为集合Vnew中的元素,而v不在Vnew集合当中,**并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);

b.将v加入集合Vnew中,将<u, v>边加入集合Enew中;

4).输出:使用集合Vnew和Enew来描述所得到的最小生成树。

图解:
在这里插入图片描述
假设有A,B,C,D,E 5个村庄要修路使每个村子都有路连接(A->B->C也算A,C相连),但是要修路的总长度最小.

1.假设重A村开始选择;

A只有3个选择,即<A,D>=5,<A,C>=7,<A,E>=10,其中A,D之间最短所以选择A,D修路
在这里插入图片描述
2.A,D之间修了路后A,D变成了一个整体也有3种选择即<A,C>=7,<A,E>=10,<D,B>=9,所以应该选择路径最短的A,C,这就是普里姆算法体现出来的全局优先
在这里插入图片描述
3.A,C之间修了路,A,C,C变成了一个整体,有了4种选择即<A,E>=10,<C,E>=6,<C.B>=12,<D,B>=9,所以应该选<C,E>=6,C,E之间修路

在这里插入图片描述

4.C,E之间修路后有3中选择即<C,B>=12,<D,B>=9,<E,B>=4,所以应该在E,B之间修路,这时各个村庄就完全修通了.
在这里插入图片描述

完整Java代码实现

package com.yg.algorithm;/*
@author  Mu_Mu
@date    2020/3/20  9:50
*/

import javax.validation.constraints.Max;
import javax.xml.crypto.Data;
import java.util.Arrays;

public class PrimAlgorithm {
    //表示不能互互通的顶点之间的距离
    private static final int MAX = 10000;
    public static void main(String[] args) {
    char []data={'A','B','C','D','E'};
    //构建顶点之间的距离
    int [][]weight={{MAX,MAX,7,5,10},{MAX,MAX,12,9,4},
            {7,12,MAX,MAX,6},{5,9,MAX,MAX,MAX},{10,4,6,MAX,MAX}};
        Graph graph = new Graph(data.length);
        MinTree.setGraph(graph, data.length, data, weight);
        MinTree.showGraph(graph);
        MinTree.minPath(graph,0);
    }

}

class MinTree {
    //构建图
    public static void setGraph(Graph graph, int verxs, char[] data, int[][] weight) {
        for (int i = 0; i < verxs; i++) {
            graph.data[i]=data[i];
            for (int j = 0; j < verxs; j++) {
                graph.weight[i][j]=weight[i][j];
            }
        }
    }

    //构建最优修路路径
    //v代表从哪个顶点开始修
    public static void minPath(Graph graph,int v) {
        //用于记录哪些顶点已经被选过了
        int []visited=new int[graph.verxs];
        //表示V被选过了
        visited[v]=1;
        //表示n个顶点需要n-1条边
        for (int i = 1; i < graph.verxs; i++) {
            //最小路径
            int minPath= 10000;
            int h1=-1;//用于记录最小路劲对应的已选择过顶点的下标
            int h2=-1;//用于记录最小路劲对应的未选择过顶点的下标
            //用来每次选取距离已被选过的边这个集体最近的边,并确定路径
            for (int j = 0; j < graph.verxs; j++) {
                for (int k = 0; k < graph.verxs; k++) {
                    if (visited[j]==1 && visited[k]==0 && graph.weight[j][k]<minPath ) {
                        minPath=graph.weight[j][k];
                        h1=j;
                        h2=k;
                    }
                }
            }
            System.out.println("已选择顶点中" + graph.data[h1] + "与未选择顶点中"
                    + graph.data[h2] + "相连权值为" + graph.weight[h1][h2]);
            visited[h2]=1;
        }
    }

    //打印图
    public static void showGraph(Graph graph) {
        for (int[] w : graph.weight) {
            System.out.println(Arrays.toString(w));
        }
    }
}

class Graph {
    public int verxs=0;//顶点数
    public char []data;//顶点数据
    public int [][]weight;//表示图之间的边

    public Graph(int verxs) {
        this.verxs = verxs;
        data=new char[verxs];
        weight=new int[verxs][verxs];
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Prim算法解决修路问题 的相关文章

  • MySQL 常用高可用方案

    这一节内容来简单聊聊 MySQL 最常用的几种高可用方案 1 主从或主主 Keepalived 主从或主主 Keepalived 算是历史比较悠久的 MySQL 高可用方案 常见架构如下 其大致原理是 在主实例的 Keepalived 中
  • AIGC之Stable Diffusion 提示词学徒库

    前言 描述 本文主要用来记录 提示词TAG 一 提示词 1 提升画面品质的提示词 masterpiece 杰作 best quality 最佳品质 ultra highers 超高分辨率 8k resolution 8k分辨率 realis

随机推荐

  • C++基础问题

    1 在 main 函数执行之前和之后的代码可能是什么 main 函数执行之前 初始化系统相关资源 设置栈指针 初始化 static 变量和 global 变量 未初始化的全局变量赋初值 全局对象初始化 这里会调用构造函数 这是可能会调用的代
  • 为什么越来越多的 IT 人考软考?

    近几年随着国家计算机与软件技术的发展 每年报名参加软考考试的人也越来越多 据工信部新闻发布会消息 计算机软件与通信专业技术人员职业资格考试累计报考人数超过485万 2022年报考人数129万人 01 为什么越来越多的IT人考软考证书 1 软
  • 【精品示例】超实用Python爬虫入门实例——做一个优质舔狗

    引言 最近发现了一个有意思的网站 里面充斥了大量的舔狗箴言 作为一个爬虫发烧友怎么能错过此等机会 咱们直接就是上才艺 类的编写 本次爬虫使用了多协程的方案进行 保证了爬虫的速度 在这里我们新建一个爬虫类 并在里边添加上我们需要的方法 网页的
  • IDEA打包上传到阿里云私服

    上传阿里云私服报错 ERROR Failed to execute goal org apache maven plugins maven deploy plugin 2 8 2 deploy default deploy on proje
  • 通讯录系统图形化界面(C++,Qt5.12)(Visual Studio2019,QtCreator)(初学)

    目录 无用的前言 无用的话 无需用看 前言 一 开发工具 二 功能演示以及 源码和安装包 下载 三 功能介绍以及设计思路 四 代码具体实现 项目文件结构 main cpp mainwindow ui mainwindow h mainwin
  • 2.前端笔记-CSS-字体属性

    1 字体系列 CSS使用font family属性定义文本的字体系列 body font family 思源黑体 Microsoft YaHei 建议 使用英文写字体的属性值 尽量使用系统默认自带字体 保证在任何用户的浏览器都可以显示 微软
  • react 入坑学习(十四)混合菜单新模式(ANT ProLayout)

    混合菜单新模式 样例 Ant Design Pro Blog 文档 这个明显就比非混合的好看很多 今天就来试试改一改吧 现在官网中找到ProLayout 就可以找到这个混合模式的源码样例 import React from react im
  • css实现文本超出显示省略号

    一 普通情况下 1 固定width 2 overflow hidden 3 text overflow ellipsis 显示为省略号 4 white space nowrap 不换行 二 table表格里 td 设置上面的4步 table
  • Selenium 之订制启动Chrome的选项(Options)

    使用 selenium 时 我们可能需要对 chrome 做一些特殊的设置 以完成我们期望的浏览器行为 比如阻止图片加载 阻止JavaScript执行 等动作 这些需要 selenium的 ChromeOptions 来帮助我们完成 1 什
  • 3.Open3D教程——点云数据操作

    点云数据 本教程阐述了基本的点云用法 随需要的文件链接 1 显示点云 import open3d as o3d import numpy as np print Load a ply point cloud print it and ren
  • ESDA in PySal (3):Geosilhouettes:集群拟合的地理测量

    ESDA in PySal 3 Geosilhouettes 集群拟合的地理测量 Silhouette statistics Rousseeuw 1987 是观测值与给定聚类的拟合优度的非参数度量 在聚类具有 地理 解释的情况下 例如当它们
  • 【Linux】进程优先级,环境变量,进程地址空间

    文章目录 1 进程优先级 基本概念 查看系统进程 PRI and NI PRI vs NI 修改进程优先级的命令 其他概念 2 环境变量 基本概念 查看环境变量方法 常见环境变量 测试PATH 环境变量相关的命令 环境变量的组织方式 通过代
  • 心理学的166个现象---之六

    101 拍球效应 拍篮球时 用的力越大 篮球就跳得越高 对学生的期望值越高 学生潜能的发挥就越充分 优秀的老师总是尽可能地信任学生 不断鼓励学生 而批评则尽可能委婉 不使矛盾激化 102 旁观者效应 1993年 四川达竹矿务局一名高考超过录
  • pytorch模型训练的若干问题

    1 Net input 调用的是什么函数 为什么直接写对象名就直接调用函数了 net是创建的vgg类的对象 vgg类继承于pytorch库中类nn Module 创建类时的括号里写上父类的名字 就是继承的意思 在pytorch库中nn Mo
  • QTableWidget 设置表头颜色

    QTableWidget 设置表头颜色 方法1 setStyleSheet QHeaderView section background color qlineargradient x1 0 y1 0 x2 0 y2 1 stop 0 00
  • android sdk自带的fragment标签使用

    项目开发中要用到 下面四个大分类 上面三个小分类的情况 大分类采用viewPage 小分类 使用了sdk自带的
  • 制造业软件体系结构与互联网的差异

    本人自毕业已经13年 虽然热爱计算机 但是由于种种原因 一直在东莞的工厂混迹 感受着互联网的大潮 也不免有几分失落 伴随这去年 今年大厂裁人 许多被逼无路的程序员开始跳槽制造业 浓浓的Java气息来了 在此不免吐槽一句 请不要把写互联网程序
  • ESP32-PICO-D4下载程序出现 rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) flash read err, 1000

    备注 是我自己记录用的 有问题可以交流 用的Visual Studio Code Arduino platformio开发 最近现在在搞物联网 发现ESP32这款芯片容易上手 而且功能强大 买的开发板用起来很顺手 于是我就自己从立创开源上找
  • 解决cannot be cast to class jakarta.servlet.Servlet问题

    我的Tomcat版本是10 0 5 这个问题的主要原因是因为 10版本的Tomcat的servlet包变化了 解决问题方法 IDEA选择这个直接完美解决 IDEA选择这个直接完美解决 IDEA选择这个直接完美解决 1下载对应的包并且导入 下
  • Prim算法解决修路问题

    普里姆算法 Prim算法 图论中的一种算法 可在加权连通图里搜索最小生成树 意即由此算法搜索到的边子集所构成的树中 不但包括了连通图里的所有顶点 英语 Vertex graph theory 且其所有边的权值之和亦为最小 普里姆算法和Kru