最小生成树算法(prim算法)

24 篇文章 12 订阅
13 篇文章 0 订阅
该博客介绍了如何运用Prim算法解决图论中的最小生成树问题,即找出连接所有点的最短路径。文章通过示例图和代码解释了算法过程,初始化所有点的距离为无穷大,从某个点开始遍历,每次找到距离集合最短的点并加入集合,更新其他点到集合的最短距离,直至所有点被包含。最后,累加所有点到集合的最短距离得到总路径长度。
摘要由CSDN通过智能技术生成

我们学习最短路是为了解决某一个点到另一个点的最短距离,而最短路研究的一定是从某点到某点,我们计算出的是两点间的最短距离。

但是这里我们给出另一个问题,我们要求你求出当所有点连接起来时,最短的路径是多少?这个时候问题就变成了如何求出把所有点连接起来时的总路径;

我们思考这样一个问题,当我们要求得总体最短,也就是每个点都要找到距离他最短的点,那么每个点找到的一定是距离他最短距离的点;

然后把这个数值加入到我们的答案中即可;

看图:

例如这张图,在这里我们最开始把所有的点都初始化为了无穷大,然后把1的位置赋值为一,这样的话我们可以从一开始查找,每次我们都需要找到其他所有点,然后更新这个点的到集合的最短距离,然后把这个点加入到集合中;

代码如下:

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

int w[1010][1010],dist[1010];
bool st[1010];
int n,m;
void prim()
{
	memset(st,0,sizeof st);//初始所有点都没有加入 
	memset(dist,0x3f,sizeof dist);//所有点都是距离无穷大; 
	dist[1]=0;//从这里开始遍历 
	
	for(int i=1;i<n;i++)
	{
		int t=-1;
		for(int j=1;j<=n;j++)
		if(!st[i]&&(t==-1||dist[t]>dist[j]))
		t=j;//找到距离最短的那个点 
		
		st[t]=true;//加入我们的集合 
		
		for(int j=1;j<=n;j++)
		{
			if(!st[i])
			dist[j]=min(dist[j],w[t][j]);//对所有点到集合距离更新 
		}
	}
	
}
int main()
{

	cin>>n>>m;
	for(int i=0;i<m;i++)
	{
		int a,b,c;
		cin>>a>>b>>c;
		w[a][b]=w[b][a]=min(w[a][b],c);//这里多加一步对重边的特判,只要最短 
	}
	
	prim();
	
	int ans;//存储答案;这里保证了一定联通 
	for(int i=1;i<=n;i++)//就算不联通,加一层判断即可,最后的答案直接输出
	ans+=dist[i]; 
	cout<<ans;
	
	
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值