最小生成树的权值之和-Prim算法

2023-10-26

【问题描述】
已知含有n个顶点的带权连通无向图,采用邻接矩阵存储,邻接矩阵以三元组的形式给出,只给出不包括主对角线元素在内的下三角形部分的元素,且不包括不相邻的顶点对。请采用Prim算法,求该连通图从1号顶点出发的最小生成树的权值之和。
【输入形式】
第一行给出结点个数n和三元组的个数count,以下每行给出一个三元组,数之间用空格隔开。(注意这里顶点的序号是从1到n,而不是0到n-1,程序里要小心!)
【输出形式】
求解的最小生成树的各条边、边的权值之和
【样例输入】
5 8
2 1 7
3 1 6
3 2 8
4 1 9
4 2 4
4 3 6
5 2 4
5 4 2
【样例输出】

1-3:6
3-4:6
4-5:2
4-2:4
18

【样例说明】
权值是正整数,可能很大,但不需要考虑整型溢出问题

以下为本人学习数据结构时写的代码,比较的长,后面有自己重写的较短的代码供大家查阅

#include<iostream>
#define maxsize 100
using namespace std;
int graph[maxsize][maxsize];
int ans = 0;//MST权值之和
struct Node
{
	int v;//顶点
	bool isSelect;//是否选中
	int distance;//到集合的距离
	int adj;//邻接顶点
};
void initMST(Node MST[], int n)
{
	for (int i = 1; i <= n; i++)
	{
		MST[i].v = i;
		MST[i].distance = graph[i][1];
		if (i == 1) MST[i].isSelect = true;
		else MST[i].isSelect = false;
		MST[i].adj = 1;
	}
}
bool isAllSelect(Node MST[], int n)
{
	for (int i = 1; i <= n; i++)
	{
		if (MST[i].isSelect == false) return false;
	}
	return true;
}
void searchMinDistanceNode(Node MST[], int n,int &v1,int &v2)
{
	int min = MST[1].distance;
	for (int i = 1; i <= n; i++)
	{
		if (MST[i].isSelect) continue;
		for (int j = 1; j <= n; j++)
		{
			if (MST[j].isSelect)
			{
				if (graph[i][j]< min)
				{
					v1 = j;
					v2 = i;
					min = graph[i][j];
				}
			}
		}
	}
	MST[v2].isSelect = true;
	MST[v2].distance = min;//更新被选择的节点的距离
	MST[v2].adj = v1;//更新被选择节点的邻接点
}
void updateMST(Node MST[], int n)
{
	for (int i = 1; i <= n; i++)
	{
		if (MST[i].isSelect) continue;
		for (int j = 1; j <= n; j++)
		{
			if (MST[j].isSelect)
			{
				if (graph[i][j] < MST[i].distance)
				{
					MST[i].distance = graph[i][j];//更新距离
					MST[i].adj = j;//更新邻接节点
				}
			}
		}
	}
}
int main()
{
	fill(graph[0], graph[0] + maxsize * maxsize, 32767);
	int n,count;//节点个数和三元组个数
	cin >> n >> count;
	for (int i = 1; i <= count; i++)//给关系矩阵赋初值
	{
		int e1, e2, e3;
		cin >> e1 >> e2 >> e3;
		graph[e1][e2] = e3;graph[e2][e1] = e3;
	}
	Node MST[maxsize];
	initMST(MST, n);
	while (!isAllSelect(MST, n))
	{
		int v1, v2;//距离最近的两个邻接点 v1是距离最近的节点,v2是被选择的节点
		searchMinDistanceNode(MST,n,v1,v2);
		cout << v1 << "-" << v2 << ":" << MST[v2].distance << endl;
	    updateMST(MST, n);//更新没有被选择的节点到被选择节点集合的距离
		ans += MST[v2].distance;
	}
	cout << ans << endl;
	//system("pause");
	return 0;
}

以下为朴素未优化版本,堆优化版本连接:https://blog.csdn.net/weixin_55085530/article/details/120391233

//时间复杂度O(n^2)可解决图中可能存在重边和自环,边权可能为负数
#include<bits/stdc++.h>
#define N 1000000
using namespace std;
int n,m,cnt,vis[N],dist[N],head[N],ans;
typedef pair<int,int>PII;
struct edge
{
    int to,next,weight;
}e[N];
void add(int u,int v,int w)
{
    e[++cnt].to=v;
    e[cnt].weight=w;
    e[cnt].next=head[u];
    head[u]=cnt;
}
void Prim()
{
     memset(dist,0x3f,sizeof(dist));
    dist[1]=-0x3f3f3f3f;
    for(int i=1;i<=n-1;i++)
    {
        int t=-1;//选取距离MST最小的点
        for(int i=1;i<=n;i++){
            if(!vis[i]&&(t==-1||dist[i]<dist[t])){
                t=i;
            }
        } 
        vis[t]=1;
        for(int i=head[t];i;i=e[i].next){
            if(!vis[e[i].to]){//更新其他未并入MST集合的点到集合的距离 
                dist[e[i].to]=min(dist[e[i].to],e[i].weight);
            } 
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
        add(v,u,w);
    }
    Prim();
    for(int i=1;i<=n;i++)
    {
        if(dist[i]==0x3f3f3f3f)
        {
            cout<<"impossible";
            exit(0);
        }
    }
    for(int i=2;i<=n;i++) ans+=dist[i];
    cout<<ans;
    return 0;
}

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

最小生成树的权值之和-Prim算法 的相关文章

  • Redis 7 第九讲 微服务集成Redis 应用篇

    Jedis 理论 Jedis是redis的java版本的客户端实现 使用Jedis提供的Java API对Redis进行操作 是Redis官方推崇的方式 并且 使用Jedis提供的对Redis的支持也最为灵活 全面 不足之处 就是编码复杂度
  • Java 区块链BLOCKCHAIN中区块BLOCK的hash值的计算

    Java 区块链中区块的hash值的计算 计算方法有多种 如 可以直接String拼接 也可以用stringbuffer 或者stringbuilder 这里采用了速度较快的stringbuilder 自己编程的时候可采用stringbuf

随机推荐

  • 实验:使用SSMS创建并管理数据库及其基本表(代码版)

    目录 一 实验要求 1 使用SQL命令创建学生课程 SCC 数据库 2 使用SQL命令学生课程数据库中的学生表 S 课程表 C 选课表 SC 并保存关闭设计窗口 3 使用SQL命令修改基本表结构 即增加和删除列 4 使用SQL命令创建及管理
  • Everything+cpolar内网穿透轻松实现公网远程访问本地硬盘文件

    公网远程访问本地硬盘文件 内网穿透 文章目录 公网远程访问本地硬盘文件 内网穿透 前言 1 下载cpolar和Everything软件 3 设定http服务器端口 4 进入cpolar的设置 5 生成公网连到本地内网穿透数据隧道 总结 前言
  • Request和ThreadLocal

    Web容器中有三个周期 request Httpsession application 其中request是客户端发出的一个请求 这个request的载体就是一个 线程 实际等同于一个线程的生命周期 Request是封装在线程上面一个抽象概
  • windows下pip安装mysqlclient失败

    环境 windows8家庭版 python3 6 7 在虚拟环境中pip install mysqlclient报错 解决方案 下载地址 ctrl f键入mysqlclient 找到对应的版本即可 博主是python3 6 7 所以选择了倒
  • 2021 程序媛跳槽记:学习计划篇

    三妹跳槽系列文章 2021 程序媛跳槽记 百度阿里字节等各大厂面经篇 2021 程序媛跳槽记 必刷LeetCode算法题 附解题报告 坦白说 我这个人不算聪明 基础也不咋样 这次跳槽我一开始是很没信心的 甚至想把这次尝试当做试水 如果受打击
  • Go_数组遍历、最大值、求和、多维数组

    数组 数组就是用来存储数据的容器 存储多个数据时数据类型要一致 如果想要保存任意类型数据 需要声明为接口类型数组 数组定义完成后 可以对数组进行赋值操作 数组是通过下标来进行操作的 下标的范围是从0开始到数组长度减1的位置 特点 数组是一种
  • 关闭windows defender教程

    由于windows自带的防护软件在后台占用大量内存 然后可以使用其他第三方软件来 然后本人使用的是火绒 这里平时的内存占用了不到100MB 然后其实这里本来应该插入一个windows defender的占用内存 我记得是在200 MB 反正
  • git 上传 github报错 (Permission denied)

    文章目录 结论 起因 新建github仓库 本地仓库初始化 结论 ssh config 中 Host 值可以随意写 cat git config 中 remote origin url git B test demo git url 值 后
  • 微服务讲堂--【5】系统自举

    这里的 系统自举 借用了操作系统的概念 在操作系统启动之前 计算机要先加载自举程序 再由自举程序加载操作系统的启动程序 整个详细过程不在这里描述 可以在网络查阅相关资料 为什么要在微服务系统中特别提及系统自举这个概念呢 因为这内容很重要 而
  • Unity 勾选development Build 区别,引起的Bug,记录一下

    Unity 勾选development Build 区别 引起的Bug 记录一下 问题 编辑器运行正常 安卓真机 Build And Run 就出现了奇怪的问题 类似数组数据出现了误差 勾选development Build 想要真机调试的
  • 第十四届蓝桥杯校内模拟赛(第二期) C++题解分享

    本人是在学校机房参加的第二期模拟赛有些题目没有忘海涵 若有什么好的建议可以提出来来分享这是本小白第一篇CSDN希望能帮助到大家 第一题没啥好说的就是直接暴力枚举 这边直接上代码 稍微注释 答案 2048 include
  • CTF—web题库笔记(难度2)

    CTF web题库笔记 难度1 CTF web题库笔记 难度4 本篇文章共12道题 目录如下 目录 1 warmup 2 supersqli 3 Web php include 4 php rce 5 Web php unserialize
  • HDFS分布式文件系统(2)Java API操作HDFS

    文章目录 1 创建Maven项目 2 添加相关依赖 3 创建日志属性文件 4 启动集群HDFS服务 5 在HDFS上创建文件 6 写入HDFS文件 6 1 将数据直接写入HDFS文件 6 2 将本地文件写入HDFS文件 7 读取HDFS文件
  • Java中使用this调用构造方法

    在 Java 中 可以使用this 关键字来调用同一个类中的其他构造方法 这种方式通常被用于避免代码重复 或者在构造方法中需要进行额外的初始化操作时 在一个类中 可以定义多个不同参数列表的构造方法 如下所示 public class MyC
  • Submitting multiple batch scripts to LSF

    原文链接 https hpc ncsu edu Documents lsf scripts php Many workflows involve submitting multiple compute jobs with slightly
  • D盘新建删除移动文件需要管理员权限怎么办?

    问题描述 好像是我在进行一次d盘大瘦身之后 Program Files中的进行新建 删除时候就变得需要管理员权限了 但是d盘的其他文件夹就可以正常操作 唯独这一个Program Files 这让我很不爽 所以就想办法解决嘛 解决办法 网上说
  • 支付宝商户支付接口接入流程

    支付宝商户支付接口接入流程 详细说明支付宝商户支付接口接入流程和注意事项 便于大家在对接过程中少走弯路 实现快速对接 目前网上也有资料 这些资料不够完整全面 导致在对接过程中也会出现一些问题 其中支付功能主要包括 支付 APP支付 WAP支
  • linux如何获得宝塔账号密码信息

    在ssh终端输入 etc init d bt default 会得到如下信息
  • 14 Binder通信之应用层AIDL实现示例

    Binder通信之应用层AIDL实现示例 一 什么是AIDL AIDL Android Interface Definition Language 即Android接口定义语言 Android系统中 每个进程都运行在一块独立的内存中 在其中
  • 最小生成树的权值之和-Prim算法

    问题描述 已知含有n个顶点的带权连通无向图 采用邻接矩阵存储 邻接矩阵以三元组的形式给出 只给出不包括主对角线元素在内的下三角形部分的元素 且不包括不相邻的顶点对 请采用Prim算法 求该连通图从1号顶点出发的最小生成树的权值之和 输入形式