prim最小生成树算法

最小生成树之prim算法 最小生成树的Prim算法也是贪心算法的一大经典应用。Prim算法的特点是时刻维护一棵树,算法不断加边,加的过程始终是一棵树。   Prim算法过程: 一条边一条边地加, 维护一棵树。 初始 E = {}空集合, V = {任意节点} 循环(n – 1)次,每次选择一条边(v1,v2), 满足:v1属于V , v2不属于V。且(v1,v2)权值最小。 E = E + (v1,v2) V = V... 阅读详情
const int maxv=1000;
const int inf=1000000000;

1、邻接矩阵版prim 

int G[maxv][maxv];
int n;
int d[maxv];
bool vis[maxv]={false};

int prim()
{
	fill(d,d+maxv,inf);
	d[0]=0;
	
	int ans=0;
	
	for(int i=0;i<n;i++)
	{
		int u=-1;
		int min=inf;
		for(int j=0;j<n;j++)
		{
			if(vis[j]==false&&d[j]<min)
			{
				u=j;
				min=d[j];
			}
		}
		if(u==-1) return -1;
		vis[u]==true;
		ans+=d[u];
		for(int v=0;v<n;v++)
		{
			if(vis[v]==false&&G[u][v]!=inf&&G[u][v]<d[v])
			{
				d[v]=G[u][v];
			}
		}
	}
	return ans;
}

2、邻接表版prim

struct Node
{
	int v;
	int dis;
};

vector<Node> adj[maxv];
int n;
int d[maxv];
bool vis[maxv]={false};

int prim()
{
	fill(d,d+maxv,inf);
	d[0]=0;
	
	int ans=0;
	
	for(int i=0;i<n;i++)
	{
		int u=-1;
		int min=inf;
		for(int j=0;j<n;j++)
		{
			if(vis[j]==false&&d[j]<min)
			{
				u=j;
				min=d[j];
			}
		}
		if(u==-1) return -1;
		vis[u]==true;
		ans+=d[j];
		for(int j=0;j<adj[u].size();j++)
		{
			int v=adj[u][j].v;
			if(vis[v]==false&&adj[u][j].dis<d[v])
			{
				d[v]=G[u][v];
			}
		}		
	}
	return ans;
}

3、测试代码

#include<cstdio>
#include<algorithm>
using namespace std;

const int maxv=1000;
const int inf=1000000000;

int n,m,G[maxv][maxv];
int d[maxv];
bool vis[maxv]={false};

int prim()
{
	fill(d,d+maxv,inf);
	d[0]=0;
	
	int ans=0;
	
	for(int i=0;i<n;i++)
	{
		int u=-1;
		int min=inf;
		for(int j=0;j<n;j++)
		{
			if(vis[j]==false&&d[j]<min)
			{
				u=j;
				min=d[j];
			}
		}
		if(u==-1) return -1;
		vis[u]=true;
		ans+=d[u];
		for(int v=0;v<n;v++)
		{
			if(vis[v]==false&&G[u][v]!=inf&&G[u][v]<d[v])
			{
				d[v]=G[u][v];
			}
		}
	}
	return ans;
}

int main()
{
	int u,v,w;
	scanf("%d%d",&n,&m);
	fill(G[0],G[0]+maxv*maxv,inf);
	for(int i=0;i<m;i++)
	{
		scanf("%d%d%d",&u,&v,&w);
		G[u][v]=G[v][u]=w;
	}
	int ans=prim();
	printf("%d\n",ans);
	return 0;
}

 

Prim算法 与 Kruskal算法 求最小生成树 一、Prim算法 普利姆(Prim)算法适用于求解无向图中的最小生成树(Minimum Cost Spanning Tree)。下面是Prim算法构造最小生成树的过程图解。                            &nbsp... 阅读详情

相关推荐

图的最小生成树之Prim算法及Kruskal算法

最小生成树 定义:无向图连通图G中,由所有顶点构成且总价值(连接权值和)最低的一棵树(拓扑结构)称为一个最小生成树。 最小生成树顶点为|V|个,边数为|V|-1,没有圈。 对任一生成树T,如果将图中一条不属于T的边添加至T,则会产生一个圈,从该圈中除去任意一条边,则会又恢复成生成树。 下图为一示例: 对于上面的无向有权连通图,其最小生成树为: 解决最小生成树问题有两种算法Prim算法和...

SanFancsgo的博客 5238

搜索专题

DFS(深度优先遍历) 最基本 1、深度优先搜索是一种枚举所有完整路径以遍历所有情况的搜索方法,使用递归可以很好的实现深度优先搜索,使用递归来实现DFS的本质其实是栈。 问题:有n件物品,每件物品的重量为w[i],价值为c[i],现在需要选出若干件物品放入一个容器为V的背包中,使得在选入背包的物品重量和不超过容量V的前提下,让背包中物品的价值之和最大,求最大价值(1&lt;=n&lt;=20...

猪窝 247

PaddleOCR实战:从零开始打造专属OCR模型的完整指南

本文提供了一份从零开始使用PaddleOCR打造专属OCR模型的完整实战指南。内容涵盖环境搭建、数据标注与准备、模型训练与调优,以及最终的模型转换与部署。重点介绍了如何利用PaddleOCR进行模型训练,并整合PPOCRLabel等工具高效准备数据集,帮助开发者快速构建适用于特定场景的高精度OCR识别能力。

rl6adventurer的博客 733

图的最短路径算法Dijkstra算法模板

Dijkstra算法:伪代码 1 //G为图,一般设为全局变量,数组d[u]为原点到达个点的额最短路径, s为起点 2 Dijkstra(G, d[u], s){ 3 初始化; 4 for (循环n次){ 5 u = 是d[u]最小的且还未访问的顶点的标号; 6 记u已经被访问; 7 for (从u出发能到达...

Lucky小黄人的博客 267

别再让电池充不满!用CN3791芯片设计太阳能充电电路,这几个调试坑我帮你踩了

本文详细解析了使用CN3791芯片设计太阳能充电电路时的常见调试问题及解决方案。从RCS电阻的选择到MPPT电压偏差的修正,再到线路损耗和温度补偿的优化,提供了全面的避坑指南。通过实测数据和优化方案,帮助工程师提升锂电池充电效率,确保太阳能充电电路的稳定性和可靠性。

weixin_42528191的博客 241

《数据分析岗笔试高频题:字节常用的SQL与AB测试考题解析》

• 核心考点:用RANK()/DENSE_RANK()/ROW_NUMBER()排序,SUM() OVER()计算累积值。◦ 用公式n=2*(Zα/2+Zβ)^2*σ²/δ²,取α=0.05,β=0.2,计算得每组需260人;◦ 关注字节技术公众号“字节跳动数据团队”,学习真实AB测试案例(如“推荐算法优化实验”)。• 题型分布:SQL编程题(40%)、AB测试方案设计(30%)、数据洞察题(30%);◦ 牛客网“字节跳动SQL真题”(如“统计用户7日留存”“广告投放ROI计算”)。

2501_91651594的博客 1109

图的深搜

通用模板(思路) DFS(u) { visit[u]=true; for(从u出发所能到达的所有顶点v) { if visit[v]==false DFS(v) } } DFSTrave(G) { for(G的所有顶点u) if visit[u]==false DFS(u); } const int maxv=1000; const int inf=100...

Curtis’Blog 367

嵌入式:简单的service框架

在嵌入式中,我们获取一个资源、设置一个变量、更新数据的话最直接的方式就是直接调用一个函数。这样的写法也可以满足基本的功能,前提是这个系统是只要一个任务,只有一个while(1)如图1.1。图1.1当有两个或者两个以上的任务的时候,同时调用一个函数(设置一个状态值、操作同一个资源、操作指针等行为)的流程如图1.2。图1.2当两个任务同时操作一个资源的时候,就会有重入的问题,会导致想不到的异常问题(数据不对、指针异常等)。

stupid的博客 986

【数据结构】图论算法笔记整理

【数据结构】图论算法图的遍历 有两种存储方式:邻接矩阵和邻接表 在一些顶点数目比较大(一般顶点个数在1000以上)的情况下,都需要使用邻接表而不是邻接矩阵来存储图 深度优先搜索dfs遍历图 按深度优先的方式访问所有未被访问的结点,在结点被访问过后标记为已访问 dfs(u) { vis[u] = true; for(从u除法道能到达的所有顶点v) if(vis[v] == false) d

柳婼 の blog 1562

ads设计Doherty功放(1)

Doherty功放的设计

qq_40995480的博客 2万+

21、空间数据处理中的克里金方法及应用

本文介绍了空间数据处理中的克里金方法,特别是带外部漂移的克里金法(KED)及其在遥感数据融合和支持变化问题中的应用。讨论了克里金方法的基本原理、优缺点以及在不同空间分辨率遥感图像融合中的具体操作流程。同时,还涉及了地统计数据融合和支持变化问题的解决方案,包括块克里金法、面到点克里金法和多边形克里金法等。

gold的博客 90

Prim算法实现最小生成树

Prim算法求最小生成树: 1. 从任意一个顶点(假设选1)开始构造生成树,首先将顶点1加入生成树中,用一个一维数组book标记那些顶点已经加入到了生成树中。 2. 用数组dis记录生成树到各个顶点的距离。最初生成树只有1号顶点,有直连边时,数组dis中存储的就是1号顶点到该顶点的边的权值,没有直连边的时候就是无穷大(INT_MAX),即初始化数组。 3. 从数组dis中选出离生成树最近的顶点(假设为顶点j)加入到生成树中(在数组dis中的最小值)。再以j为中间点,更新生成树到每一个非树顶点的距离,如果

qq_44423388的博客 1万+

Qt版Dalsa线扫相机的采集Demo

Qt Dalsa

追赶时代的博客 605

最小生成树——prim算法

最小生成树(Minimum Spanning Tree,MST)是在一个给定的无向图G(V,E)中求一棵树T,使得这棵树拥有图G中的所有顶点,且所有边都是来自图G中的边,并且满足整棵树的边权之和最小。下图给出了一个图G及其最小生成树T,其中较粗的线即为最小生成树的边。可以看到,边AB、BC、BD包含了图G的所有顶点,且由它们生成的树的边权之和为6,是所有生成树中权值最小的。 最小生成树有3...

分享包括但不限于计算机基础知识、数据结构与算法、Golang技术栈。年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐,将复何及! 1万+

基于STM32L4XX、HAL库的ICM-42607-P姿态传感器驱动程序设计

/ 转换为dps(±1000dps量程)float accel_x = sensor_data.accel_x * (8.0f / 32768.0f);// 转换为g值(±8g量程)#define ICM42607_I2C_ADDR 0x68 << 1 // I2C地址(SA0=0)= 0x40) { // ICM-42607的WHO_AM_I值为0x40。// 读取传感器数据。

zhusl6688的博客 835

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

用Prim算法和Kruskal两种算法实现构建并输出最小生成树

m0_63223213的博客 7991

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Prim算法求最小生成树

求无向网的最小生成树的算法有两种:Prim和Kruskal,它们都是利用最小生成树的MST性质得到的。我们先来介绍Prim算法,Kruskal我们后续介绍。 Prim算法思想: 逐渐长成一棵最小生成树。假设G=(V,E)是连通无向网,T=(V,TE)是求得的G的最小生成树中边的集合,U是求得的G的最小生成树所含的顶点集。初态时,任取一个顶点u加入U,使得U={u},TE=Ø。重复下述操作:找出U和...

yyzsir的博客 4万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

最小生成树:Prim算法

讲构建最小生成树的算法前,先来回顾一下什么是生成树,什么是最小生成树?生成树是指:在一个连通图Graph中,包含Graph中所有n个顶点的极小连通子图,一定包含Graph中的n-1条边(如果小于n-1条边,生成树会不连通。如果大于n-1条边,就一定会产生回路,那么就不是树了,树中不能产生回路)。且生成树不唯一。举个例子: 这个无向连通图的生成树分别有 什么是最小生成树? ...

大力海棠的博客 2万+

【数据结构】最小生成树Prim算法

概况 最小生成树是是原图的极小连通子图,是最小权重生成树的简称。其特点是:图中包含原图中的所有 n 个结点,并且有保持图连通的最少的边。 求最小生成树有两种算法,分别是:Kruskal(克鲁斯卡尔)算法、Prim(普里姆)算法。 本文将介绍笔者对Prim算法的理解。Kruskal算法将在后续文章介绍。 Prim算法 该算法需要用邻接矩阵存储图(使用edge数组记录边的权值,vertex数组存储顶点数据)。 class MGraph { public: MGraph(DataType a[ ], in

zgsdlr的博客 3037

C/C++ 最小生成树—Prim算法

一、最小生成树 二、Prim算法(普里姆算法) 三、举一个栗子(镖局运镖)

Carizy的博客 4492

最小生成树--Prim算法

Prim算法是一种常用的解决最小生成树问题的算法,通过简单的贪心策略,可以找到连接所有顶点并且总权值最小的树。我们可以采用堆优化、稠密图优化和限制集合优化等技巧来提高算法的效率,并解决一些带有限制的问题。在实际应用中,可以根据具体问题的不同选择合适的优化技巧,来得到更好的算法性能和解决方案。

xin__xiao的博客 5811

最小生成树Prim算法理解

MST(Minimum Spanning Tree,最小生成树)

在路上的学习者 17万+

prim算法求最小生成树

描述: 使用prim算法求某图的最小生成树的边的权值输出的序列。例如下图的最小生成树的权值输出序列为1 4 2 5 3,要求从V1顶点开始生成最小生成树。 输入: 若干行整数 第一行为两个整数,分别为图的顶点数和边数 第二行开始是该图的邻接矩阵,主对角线统一用0表示,无直接路径的两点用100来表示(保证各边权值小于100) 输出: 若干用空格隔开的整数 样例输入: 6 10 0 6 1 5 10...

clzZ2的博客 6733

最小生成树—Kruskal算法和Prim算法

求图的最小生成树的两种算法Kruskal算法和Prim算法解析

终为nullptr 2279

最小生成树 Prim 算法

4. 从T类的所有顶点出发(A,B),与G类中的顶点相连通的边分别是权值为A->C=2,A->D=3 ,B->C=7,B->E=8 的四条边,选择权值为A->C=2那条最小的边作为最小生成树的一部分,将其所连的属于G类中的顶点C移到T类中,得到 T={A,B,C},G={D,E,F}。2.在 G 类中任选一个顶点作为 最小生成树的起点,假设选择顶点 A,然后将顶点 A 移到 G类中,就有 T={A},G={B,C,D,E,F}。1.将图中的所有顶点分为 T 类 和 G 类,初始状态下,T = {

qq_64485082的博客 1827
上一篇: 弗洛伊德算法【全源最短路径】
下一篇: kruskal最小生成树算法
Estrellas_
博客等级 码龄9年 273粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值