c++最小生成树实现

news2024/9/22 1:32:45

文章目录

  • 参考文章
  • 目的
  • c++实现

参考文章

点击访问

目的

实现参考文章中的图结构,并计算它的最小生成树

c++实现

#include<iostream>
#include<vector>
#include<map>

class Node
{
public:
	Node(const int val) :value(val) {}

	int value;
	std::map<int, int> edges;
};

class PrimAlgorithm
{
public:
	bool prim(const std::vector<Node>& all_nodes,
		std::vector<Node>& prim_nodes, int& sum_result);

	bool updateDist(Node& node, std::vector<int>& dist);
};




bool PrimAlgorithm::prim(const std::vector<Node>& all_nodes,
	std::vector<Node>& prim_nodes, int& sum_result)
{
	int size = all_nodes.size();
	std::vector<int> dist(size+1, INT_MAX);
	dist[0] = -1; // 不使用index=0的索引
	/*for (const auto& item : dist) std::cout << item << " ";
	std::cout << std::endl;*/
	Node randNode = all_nodes[0];
	prim_nodes.push_back(randNode);
	dist[1] = 0;
	for (int i = 1; i < size; ++i)
	{
		Node node = prim_nodes[prim_nodes.size() - 1];
		updateDist(node, dist);
		/*for (const auto& item : dist) std::cout << item << " ";
		std::cout << std::endl;*/

		// 选择dist大于0且值最小的那个顶点
		int minVal = INT_MAX;
		int minIndex = 0;
		for (int j = 1; j < dist.size(); ++j)
		{
			if (dist[j] > 0 && dist[j] < minVal)
			{
				minVal = dist[j];
				minIndex = j;
			}
		}
		sum_result += minVal;
		//std::cout << "minIndex=" << minIndex << std::endl;
		
		for (const auto& node : all_nodes)
		{
			if (node.value == minIndex)
			{
				prim_nodes.push_back(node);
				break;
			}
		}
		dist[minIndex] = 0; // 将这个位置的dist置0, 因为它已经在最小生成树里了
	}	
	return true;
}


bool PrimAlgorithm::updateDist(Node& node, std::vector<int>& dist)
{
	//std::cout << "node.vale=" << node.value << std::endl;
	for (int i = 1; i < dist.size(); ++i)
	{
		if (node.edges.find(i) == node.edges.end()) continue; // 没有这个邻边
		else
		{
			if (node.edges[i] < dist[i])
			{
				dist[i] = node.edges[i]; // 更新dist
				//std::cout << "i=" << i << ", dist[i]=" << node.edges[i] << std::endl;
			}
		}
	}
	return true;
}


int main()
{
	std::vector<Node> allNodes;
	Node one(1);
	one.edges[7] = 36;
	one.edges[2] = 23;
	one.edges[6] = 28;
	allNodes.push_back(one);

	Node two(2);
	two.edges[1] = 23;
	two.edges[7] = 1;
	two.edges[3] = 20;
	allNodes.push_back(two);

	Node three(3);
	three.edges[2] = 20;
	three.edges[7] = 4;
	three.edges[4] = 15;
	allNodes.push_back(three);

	Node four(4);
	four.edges[3] = 15;
	four.edges[7] = 9;
	four.edges[5] = 3;
	allNodes.push_back(four);

	Node five(5);
	five.edges[4] = 3;
	five.edges[7] = 16;
	five.edges[6] = 17;
	allNodes.push_back(five);

	Node six(6);
	six.edges[1] = 28;
	six.edges[7] = 25;
	six.edges[5] = 17;
	allNodes.push_back(six);

	Node seven(7);
	seven.edges[1] = 36;
	seven.edges[2] = 1;
	seven.edges[3] = 4;
	seven.edges[4] = 9;
	seven.edges[5] = 16;
	seven.edges[6] = 25;
	allNodes.push_back(seven);

	std::vector<Node> primNodes;
	int sumResult = 0;
	
	PrimAlgorithm pag;
	pag.prim(allNodes, primNodes, sumResult);

	for (const auto& node : primNodes)
	{
		std::cout << node.value << " ";
	}
	std::cout<<std::endl;

	std::cout << "dist all = " << sumResult << std::endl;

	return 0;
}

在这里插入图片描述
与预期一致
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1940940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu 查询未更新的包 进行手动更新

lsb_release -a 查询ubuntu的版本号&#xff0c;我这边是20.04 apt list --upgradable 查询未更新的包 sudo apt --only-upgrade install php/focal 中间遇到输入选择&#xff0c;输入y即可

SpringBoot常用功能实现

1. 配置文件多环境配置 1.1 创建不同环境配置文件 文件名前缀和后缀为标准固定格式&#xff0c;不可以改变。 1.2 pom中加入文件配置 可以使用<activation>标签设置默认环境。 <profiles><profile><id>dev</id><activation><active…

yolov5进行识别安全帽

进行毕业设计 下载yolov5使用按照教程来进行就行注意事项&#xff08;有必要看看&#xff09;效果 总结 下载yolov5 地址是&#xff1a;https://github.com/ultralytics/yolov5 使用按照教程来进行就行 这里简单说一下&#xff1a; 下载需要的命令&#xff1a; pip install -…

【人工智能】AI绘画工具介绍

目录 引言 热门AI绘画工具 1. DeepArt 2. Artbreeder 3. DALLE 4. Deep Dream Generator 5. Midjourney 使用AI绘画工具的优势 知识扩展 1. 生成对抗网络&#xff08;GANs&#xff09; 2. 变分自编码器&#xff08;VAEs&#xff09; 3. 扩散模型&#xff08;Diffus…

vue 实现打字机效果

打字机效果组件&#xff0c;支持像打字机一样模仿键入文本。支持vue 插值语法和表格等打印 ps: 灵感来着于vue-type-writer 但是 这个组件过于简单 就自己整了一个 一、预览 二、代码 组件&#xff1a; <template><div :style"{ visibility: visibility }&qu…

皇后游戏1

先把这个推导看完 现在我们来讲一下总结 首先&#xff0c;我们要观察到 c i c_i ci​递增&#xff0c;这样才能更简单&#xff0c;就不用像国王游戏那样在交换前后比较 i i i和 j j j的max了&#xff08;就是说&#xff0c;国王游戏需要比较 m a x ( c i , c j ) max(c_i,c_j)…

酒店管理系统(C语言)

系统分析 本系统分为以下6大模块&#xff1a;顾客登记模块、查询顾客信息模块、查询空房间模块、预订房间模块、退订房间模块、保存并退出模块&#xff0c;如下图所示。 1. 顾客结构体 2. 主菜单的设计及实现 3. 登记顾客模块的实现 4. 查询顾客信息功能的实现 5. 查询空房间功…

ubuntu系统vscode调试c/c++大中型项目

文章目录 1. 插件2. 项目工程3. vsode的配置setting.jsonc_cpp_properties.json 4. 启动调试 前置阅读 vscode调试第一篇 1. 插件 c/c, cmake, cmake tools 2. 项目工程 对于我的项目需要用到很多的三方库&#xff0c;三方库的版本又会有很多&#xff0c;一般都是用cmake编译…

建图,链式前向星,拓扑排序

建图&#xff0c;链式前向星&#xff0c;拓扑排序 建图的三种方式1.邻接矩阵2.邻接表3.链式前向星 拓扑排序练习题-课程表字典序最小的拓扑排序拓扑排序模板题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 例题1.火星字典2.戳印序列 建图的三种方式 1.邻接矩阵 …

485,Modbus,开关量,UART,I2C,4-20mA,0-5V,TTL接口区别

工业和电子通信中最常见的几种类型&#xff0c;它们在数据传输方式、信号类型、通信协议、应用领域和物理特性上有所不同。下面分别解释这些接口的区别&#xff1a; 1. RS-485 类型&#xff1a;半双工差分信号传输。用途&#xff1a;用于长距离、多点通信场合&#xff0c;如楼…

Redis--12--1--分布式锁---java

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Redis与分布式锁Jedis实现1.RedisConfig2.RedisDistLock3.应用4.加上看门狗逻辑 RedisDistLockWithDog redisson实现1.依赖2.代码 Redis与分布式锁 Jedis实现 1.Re…

spring security如何适配盐存在数据库中的密码

19.token认证过滤器代码实现_哔哩哔哩_bilibili19.token认证过滤器代码实现是SpringSecurity框架教程-Spring SecurityJWT实现项目级前端分离认证授权-挑战黑马&尚硅谷的第20集视频&#xff0c;该合集共计41集&#xff0c;视频收藏或关注UP主&#xff0c;及时了解更多相关视…

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(六)-无人机直接C2通信

目录 引言 5.4 直接C2通信 5.4.1 概述 5.4.2 A2X直接C2通信服务的授权策略 5.4.3 USS使用A2X直接C2通信服务的C2授权程序 5.4.4 直接C2通信建立程序 引言 3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别…

手动构建线性回归(PyTorch)

import torch from sklearn.datasets import make_regression import matplotlib.pyplot as plt import random #1.构建数据 #构建数据集 def create_dataset():x,y,coefmake_regression(n_samples100,n_features1,random_state0,noise10,coefTrue,bias14.5)#将构建数据转换为张…

AI大模型的风过去了?不,是离我们越来越近了

OpenAI摊牌了。不再掩藏锋芒&#xff0c;拿年初预测的2亿美元收入做挡箭牌&#xff0c;“我们的年营收达到了13亿美元。”10月中旬Sam Altman终于透露出来。13亿美元&#xff0c;同比增长4500%。 国内。资本和公众的视线越来越多地放在局势变幻、芯片和造车上。 △三季度融资行…

学习系列一:YOLO系列目标检测框架之间介绍及对比

YOLO系列目标检测框架之间介绍及对比 华为HCIP AI高级工程师证书&#xff0c; 华为HCIA AI证书&#xff0c;目前从事视觉算法工作 文章目录 YOLO系列目标检测框架之间介绍及对比前言一、YOLOv1二、YOLOv2三、YOLOv3四、YOLOv4五、YOLOv5及后续算法 前言 YOLO系列算法 YOLO 创…

《0基础》学习Python——第十七讲__正则表达式(requests)

一、什么是正则表 正则表达式是一种用于匹配和操作字符串的强大工具。它可以用于检索、替换和验证字符串。正则表达式使用特定的语法来描述字符串的模式&#xff0c;然后用于查找符合该模式的字符串。 在Python中&#xff0c;可以使用re模块来使用正则表达式。re模块提供了一组…

启动流程和切换流程

启动流程 #mermaid-svg-iUWGw8xl1SyAmoo9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-iUWGw8xl1SyAmoo9 .error-icon{fill:#552222;}#mermaid-svg-iUWGw8xl1SyAmoo9 .error-text{fill:#552222;stroke:#552222;}#…

3D培训大师创新培训体验,加速空调关键组件的高效精准安装

如今&#xff0c;空调系统的复杂性和精密性与日俱增&#xff0c;对专业技术人员的要求也日益提高。尤其是决定空调是否能平稳运行的空调关键组件的装配培训&#xff0c;不再局限于传统的理论讲解和实体模型演示&#xff0c;而是更注重数字化、沉浸式学习。 案例背景 某空调公…

代码随想录算法训练营Day26 | 491.递增子序列 | 46.全排列 | 47.全排列 II | 332.重新安排行程 | 51.N皇后 | 37.解数独

今日任务 491.递增子序列 题目链接&#xff1a; https://leetcode.cn/problems/non-decreasing-subsequences/description/题目描述&#xff1a; Code class Solution { public:vector<vector<int>> findSubsequences(vector<int>& nums) {vector&l…