Prim算法

2023-05-16

MST(Minimum Spanning Tree,最小生成树)问题有两种通用的解法,Prim算法就是其中之一,它是从点的方面考虑构建一颗MST,大致思想是:设图G顶点集合为U,首先任意选择图G中的一点作为起始点a,将该点加入集合V,再从集合U-V中找到另一点b使得点b到V中任意一点的权值最小,此时将b点也加入集合V;以此类推,现在的集合V={a,b},再从集合U-V中找到另一点c使得点c到V中任意一点的权值最小,此时将c点加入集合V,直至所有顶点全部被加入V,此时就构建出了一颗MST。因为有N个顶点,所以该MST就有N-1条边,每一次向集合V中加入一个点,就意味着找到一条MST的边。

希望达到的效果是:各个点之间都连通,且使连通它们的边的权值和最小

用图示和代码说明:

初始状态:

设置2个数据结构:

lowcost[i]:表示以i为终点的边的最小权值,当lowcost[i]=0说明以i为终点的边的最小权值=0,也就是表示i点加入了MST

mst[i]:表示对应lowcost[i]的起点,即说明边<mst[i],i>是MST的一条边,当mst[i]=0表示起点i加入MST

我们假设V1是起始点,进行初始化(*代表无限大,即无通路):

lowcost[2]=6,lowcost[3]=1,lowcost[4]=5,lowcost[5]=*,lowcost[6]=*

mst[2]=1,mst[3]=1,mst[4]=1,mst[5]=1,mst[6]=1,(所有点默认起点是V1)

明显看出,以V3为终点的边的权值最小=1,所以边<mst[3],3>=1加入MST

此时,因为点V3的加入,需要更新lowcost数组和mst数组:

lowcost[2]=5,lowcost[3]=0,lowcost[4]=5,lowcost[5]=6,lowcost[6]=4

mst[2]=3,mst[3]=0,mst[4]=1,mst[5]=3,mst[6]=3

明显看出,以V6为终点的边的权值最小=4,所以边<mst[6],6>=4加入MST

此时,因为点V6的加入,需要更新lowcost数组和mst数组:

lowcost[2]=5,lowcost[3]=0lowcost[4]=2,lowcost[5]=6,lowcost[6]=0

mst[2]=3,mst[3]=0,mst[4]=6,mst[5]=3,mst[6]=0

明显看出,以V4为终点的边的权值最小=2,所以边<mst[4],4>=4加入MST

此时,因为点V4的加入,需要更新lowcost数组和mst数组:

lowcost[2]=5,lowcost[3]=0,lowcost[4]=0,lowcost[5]=6,lowcost[6]=0

mst[2]=3,mst[3]=0,mst[4]=0,mst[5]=3,mst[6]=0

明显看出,以V2为终点的边的权值最小=5,所以边<mst[2],2>=5加入MST

此时,因为点V2的加入,需要更新lowcost数组和mst数组:

lowcost[2]=0,lowcost[3]=0,lowcost[4]=0,lowcost[5]=3,lowcost[6]=0

mst[2]=0,mst[3]=0,mst[4]=0,mst[5]=2,mst[6]=0

很明显,以V5为终点的边的权值最小=3,所以边<mst[5],5>=3加入MST

lowcost[2]=0,lowcost[3]=0,lowcost[4]=0,lowcost[5]=0,lowcost[6]=0

mst[2]=0,mst[3]=0,mst[4]=0,mst[5]=0,mst[6]=0

至此,MST构建成功,如图所示:

根据上面的过程,可以容易的写出具体实现代码如下(cpp):

[cpp] view plain copy

#include<iostream>  
#include<fstream>  
using  namespace std;  
  
#define MAX 100  
#define MAXCOST 0x7fffffff  
  
int graph[MAX][MAX];  
  
int prim(int graph[][MAX], int n)  
{  
    int lowcost[MAX];  
    int mst[MAX];                                 
    int i, j, min, minid, sum = 0;  
    for (i = 2; i <= n; i++)  
    {  
        lowcost[i] = graph[1][i];  
        mst[i] = 1;                                       //mst[]存放MST外的点i到MST最短距离时候对应的MST里的点标号
    }  
    mst[1] = 0;  
    for (i = 2; i <= n; i++)                        //要找出n-1个点为止
    {  
        min = MAXCOST;  
        minid = 0;  
        for (j = 2; j <= n; j++)  
        {  
            if (lowcost[j] < min && lowcost[j] != 0)  
            {  
                min = lowcost[j];  
                minid = j;  
            }  
        }  
        cout << "V" << mst[minid] << "-V" << minid << "=" << min << endl;  
        sum += min;  
        lowcost[minid] = 0;  
        for (j = 2; j <= n; j++)  
        {  
            if (graph[minid][j] < lowcost[j])                //不更新的话,lowcost[j]存的只是上一时刻的Lowcost[j],MST外部的点到minid的距离会不会比到之前的MST里点得最小距离小?
       {  
                lowcost[j] = graph[minid][j];  
                mst[j] = minid;                               //点j到MST内的lowcot对应的MST里的点事minid
            }  
        }  
    }  
    return sum;  
}  
  
int main()  
{  
    int i, j, k, m, n;  
    int x, y, cost;  
    ifstream in("input.txt");  
    in >> m >> n;//m=顶点的个数,n=边的个数  
    //初始化图G  
    for (i = 1; i <= m; i++)  
    {  
        for (j = 1; j <= m; j++)  
        {  
            graph[i][j] = MAXCOST;  
        }  
    }  
    //构建图G  
    for (k = 1; k <= n; k++)  
    {  
        in >> i >> j >> cost;  
        graph[i][j] = cost;  
        graph[j][i] = cost;  
    }  
    //求解最小生成树  
    cost = prim(graph, m);  
    //输出最小权值和  
    cout << "最小权值和=" << cost << endl;  
    system("pause");  
    return 0;  
}  


Input:

6 10  
1 2 6  
1 3 1  
1 4 5  
2 3 5  
2 5 3  
3 4 5  
3 5 6  
3 6 4  
4 6 2  
5 6 6  


Output:

V1-V3=1  
V3-V6=4  
V6-V4=2  
V3-V2=5  
V2-V5=3  
最小权值和=15  
请按任意键继续. 

https://blog.csdn.net/yeruby/article/details/38615045

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

Prim算法 的相关文章

  • Xshell 和 Xftp 学校免费版

    Xshell 和 Xftp 家庭 学校免费版下载地址 xff1a 家庭 学校免费 NetSarang Website 填写姓名和邮箱 xff0c 下载免费版 xff0c 会发送邮件到邮箱 45M 安装完成并打开 xff1a 39M 用来传输
  • putty pscp psftp 三件套

    官网地址 xff1a https www chiark greenend org uk sgtatham putty https www chiark greenend org uk sgtatham putty latest html p
  • win10远程连接win7电脑 -- 局域网实现

    本次 xff1a 使用 windows自带 的 远程桌面连接 xff08 ok xff09 另外 xff1a 向日葵 远程软件更方便 xff0c 可以直接在公网使用 xff08 get xff09 TeamViewer 远程软件越来越不好用
  • scp 报错: Permission denied, please try again(publickey,password)

    修改密码后导致报错 Permission denied please try again publickey password 修改 etc ssh sshd config 中 PermitRootLogin yes 修改为yes 重启服务
  • 关闭树莓派的电源指示灯和状态指示灯

    在命令行输入一下指令 xff1a echo 0 sudo tee sys class leds led0 brightness 状态指示灯 范围 0 255 echo none sudo tee sys class leds led0 tr
  • 虚拟机安装Vmware Tools复制文件,共享文件

    目标1 xff1a 虚拟机安装Vmware Tools工具 先看下VMware版本 xff1a 首先 xff0c 将CD DVD切换到物理驱动器 xff1a 点击菜单 虚拟机 M 34 安装VMware Tools xff0c 虚拟DVD中
  • xavier上如何挂载SD卡

    參考博客 Jetson AGX Xavier避坑指南 六 挂载 SD 卡 zxxRobot的博客 CSDN博客 xavier挂载sd卡 AGX Xavier挂载SD卡 Bungehurst CSDN博客 Nvidia Jetson AGX
  • NXP-LPC1768起步之开发环境搭建与GPIO

    1 环境搭建 本工程使用ARM公司MDK414 低版本的可能会导致在MDK中无法下载调试程序 仿真器使用SEGGER公司JlinkV7 首先新建工程GPIO xff0c 选择路径保存 xff0c 然后会出现选择芯片界面 然后确定 xff0c

随机推荐

  • docker 修改默认存储路径的方法

    在xavier上使用docker时 由于空间不足 无法继续工程 几种修改 Docker 镜像默认存储位置的方法 墨天轮 使用方法一 使用软链接的方式 容器的存放位置在 var lib docker 默认存放位置 sudo docker in
  • linux下usb无线网卡对比

    2021年12月23日 冬月二十 xff0c 天晴 xff0c 微风 一 使用场景 1 xff0c 由于软件开发需要用到linux系统 xff0c 嵌入式设备nvidia xavier没有无线网卡 xff0c 需要自购 2 xff0c 另外
  • ubuntu 18.04.6官方下载地址

    Enterprise Open Source and Linux Ubuntu 进入界面 xff1a Download Ubuntu Desktop Download Ubuntu 点击 xff1a see our alternative
  • ubuntu误删 /var/lib/dpkg

    折腾了一个小时 Deepin Debian Ubuntu恢复误删除的 var lib dpkg 学亮编程手记的博客 CSDN博客 https jingyan baidu com article fc07f98946cd3e12fee5196
  • E: Could not get lock /var/lib/dpkg/lock

    dpkg error dpkg frontend is locked by another process dpkg error dpkg frontend is locked by another process 白蛇仙人的博客 CSDN
  • 树莓派安装花生壳软件 phddns ,没有显示SN码

    树莓派型号 xff1a Pi4B 2G 树莓派系统版本 xff1a uname a Linux raspberrypi 5 10 103 v7l 43 1529 SMP Tue Mar 8 12 24 00 GMT 2022 armv7l
  • E: Could not get lock /var/lib/dpkg/lock

    ubuntu安装软件时 xff0c 经常出现下面错误 xff1a sudo apt get install E Could not get lock var lib dpkg lock open 11 Resource temporaril
  • shell 脚本常用命令,音频提取、格式转换、切割

    实现一下功能 xff1a 1 xff0c mp4 视频文件提取 wav xff0c pcm xff1b 2 xff0c wav 切割为每段30s 的音频 xff1b 3 xff0c wav 切割后的音频转换为 pcm xff0c ffmpe
  • Apache Options Indexes FollowSymLinks详解

    如果该虚拟目录下没有 index html xff0c 浏览器也会显示该虚拟目录的目录结构 xff0c 列出该虚拟目录下的文件和子目录 如何禁止 Apache 显示目录列表呢 xff1f 要禁止 Apache 显示目录结构列表 xff0c
  • 大恒工业相机+opencv开发经历

    遇到的问题 xff1a 1 打开Daheng Galaxy Viewer x64 没有图像 由于对工业相机不熟悉 xff0c 原因是没有安装镜头 xff0c 安装镜头后可以正常使用 xff0c 否则只有白色或黑色 xff0c 用手指靠近镜头
  • Backtrace in Android

    Backtrace in Android 96 Tsing2015 0 7 2016 02 28 23 03 字数 33 阅读 2491评论 8喜欢 4 libscorkscrew so在android 5 0之后已经没有了 xff0c 之
  • CF1165B Polycarp Training

    原题链接 题目描述 Polycarp wants to train before another programming competition During the first day of his training he should
  • markdownIt大致流程分析

    文章目录 一 xff0c markdownIt模块大致流程二 xff0c 分析其执行流程三 xff0c 关于MarkdownIt实例属性options配置属性validateLink函数normalizeLink函数normalizeLin
  • 【嵌入式Bluetooth应用开发笔记】第一篇:DBUS概述与蓝牙开发小试牛刀

    DBUS概述 DBus xff08 D Bus xff09 是一个在不同程序之间传递消息的系统总线 DBus为不同的程序之间提供了一种通信机制 xff0c 这种通信制可以在不需要知道对方程序的情况下进行通信 DBus可以使用多种编程语言来开
  • 简单提升pandas技巧:如何降低内存占用率

    前言 pandas是一个Python软件库 xff0c 可用于数据分析和操作 本文记录实现一些降低内存占用的简单方法 当使用pandas操作小规模数据 xff08 低于100MB xff09 时 xff0c 性能一般不是问题 而当面对更大规
  • 腾讯云 ubuntu20 jupyter安装 服务器

    1 安装jupyter xff1a sudo pip3 install jupyterlab 注 xff1a 安装错误可能是flack没安装 xff1a pip install flask 之后再次安装jupyter 2 设置web密码 x
  • Oracle 12c 读书笔记——筑梦之路

    Oracle 12c 笔记 2020 7 13 登陆数据库 su oracle sqlplus 34 as sysdba 34 查看数据库状态 select status from v instance 修改密码 alter user sy
  • Docker容器内不能联网的解决方案

    参考资料 xff1a Docker容器内不能联网的6种解决方案 腾讯数据架构师的博客 CSDN博客 docker容器网络不通 Docker容器内不能联网的6种解决方案 1 docker网络使用 net host 模式 docker run
  • The CC version check failed下出现Failed CC version check. Bailing out! 解决方案

    这个问题是由于gcc版本不兼容导致的 先使用cat proc version查看目前系统版本下gcc的默认版本 再使用gcc version查看gcc版本 可以发现目前使用的gcc版本和系统需要的版本是不一致的 xff0c 这时候使用ls
  • Prim算法

    MST xff08 Minimum Spanning Tree xff0c 最小生成树 xff09 问题有两种通用的解法 xff0c Prim算法就是其中之一 xff0c 它是从点的方面 考虑构建一颗MST xff0c 大致思想是 xff1