#include <iostream>
#include <vector>
#define Inf 0x7fffffff
using namespace std;
int main()
{
int n,m;//节点个数和边数
cin>>n>>m;//输入节点个数和边数;
vector<vector<int>> v(n+1,vector<int>(n+1,Inf));//邻接矩阵
for(int i=0;i<m;++i)
{
int s,e,w;
cin>>s>>e>>w;
v[s][e]=v[e][s]=w;
}
int s=1,sumcost=0;//开始收录的节点,累计最小花费
vector<int> cost=v[s];
vector<bool> vis(n+1,false);//是否已经收录
vis[s]=true;
for(int k=1;k<n;++k)
{
int mincost=Inf,u=-1;
for(int i=1;i<=n;++i) if(!vis[i]&&cost[i]<mincost) mincost=cost[u=i];//找到最小花费
sumcost+=mincost;
vis[u]=true;
for(int i=1;i<=n;++i) if(!vis[i]&&cost[i]>v[i][u]) cost[i]=v[i][u];//通过新收录的节点u,重新更新最小花费
}
cout<<sumcost;
return 0;
}
最小生成树 prim算法 C++实现
最新推荐文章于 2022-05-14 11:52:12 发布
本文介绍了一种基于邻接矩阵实现的最小生成树算法。该算法首先读取节点数量及边的数量,然后建立一个初始化为无穷大的邻接矩阵来表示各个节点间的连接权重。接着通过不断寻找未被收录节点中到已收录节点距离最小的一条边,将其加入到生成树中,并更新所有未收录节点到已收录节点集合的距离,直至所有节点都被收录。
3315

被折叠的 条评论
为什么被折叠?



