最小生成树(Prim算法)

博客介绍了Prim算法,它与Dijkstra算法相似,复杂度为O(V^2),用于解决稠密图的最小生成树问题。虽可优化到ElongE,但此时不如用kruskal算法。该算法通过每次加入离生成树最近的点,从一点扩展得到最小生成树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Prim算法和Dijkstra算法很像 复杂度是O(V^2)。用于解决稠密图的最小生成树问题。虽然可以优化到ElongE,但是这个时候还不如用kruskal算法来的简单
每次往生成树集合中加入离生成树距离最近的点,从一个点慢慢的扩展,最后得到所求的最小生成树。

#include <iostream>
#include <vector>
#define maxn 1005
using namespace std;

typedef long long ll

ll vis[maxn],cost[maxn]; 
//vis[i]表示i已经被用来扩展过了,cost[i]表示扩展出这个点的代价 
ll g[maxn][maxn];    //完全图时用prim,可以用二维数组表示图 

int main()
{
	int n,m,ans = 0;
	cin >> n >> m; 
	for( int i = 1 ; i <= n ; i++ )
	{
		cost[i] = 1e8;
	}
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
			g[i][j] = 1e18;
	}
	for( int i = 0 ; i < m ; i++ )   
	{
		ll x,y,v;
		cin >> x >> y >> v;
		g[x][y] = g[y][x] = v;
	}
	int begin;   				//从begin这个点来开始生成最小生成树   
	cost[1] = 0;
	for(int i = 0; i < n; i++ )    //遍历n次生成最小生成树
	{
		ll minx = 1e18;
		for (int j = 1; j <= n; j++)      //找最小花费时直接遍历这个cost数组,寻找下一个新的节点
		{
			if( !vis[j] && minx > cost[j] ) //找寻新的点 
			{
				minx = cost[j];
				begin = j;
			}
		}
		ans += minx;   //代价加上花费 
		vis[begin] = 1;     //vis置1表示该点已经使用过来更新相邻节点 
		for (int j = 1; j <= n; j++)      //遍历该点相邻的所有边更新权值
		{
			if( !vis[j] && cost[j] > g[begin][j] )
				cost[j] = g[begin][j];
		}
	}
	cout << ans << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值