最小生成树--prim算法
程序员文章站
2022-05-20 13:17:44
...
#include<bits/stdc++.h>
using namespace std;
const int N=5010,INF=0x3f3f3f3f;//正无穷
int n,m,dis[N],g[N][N],res;
bool st[N];
int prim() {
memset(dis,0x3f,sizeof(dis));
memset(st,0,sizeof(st));
for(int i=0; i<n; i++) {
int t=-1;
for(int j=1; j<=n; j++) {
if(!st[j]&&(t==-1||dis[t]>dis[j])) {
t=j;
}
}
if(i&&dis[t]==INF)//不存在最小生成树
return INF;
if(i) {
res+=dis[t];
}
st[t]=true;
for(int j=1; j<=n; j++) {//更新距离
dis[j]=min(dis[j],g[t][j]);
}
}
return res;
}
int main() {
memset(g,0x3f,sizeof(g));//邻接矩阵 初始化为无穷大
cin>>n>>m;
while(m--) { //可能会有重边
int a,b,c;
cin>>a>>b>>c;
g[a][b]=g[b][a]=min(g[a][b],c);
}
int ans=prim();
if(ans!=INF){
cout<<ans<<endl;
}
}
输入:
4 5
1 2 2
1 3 2
1 4 3
2 3 4
3 4 3
输出:
7
上一篇: 145. 二叉树的后序遍历
下一篇: 最小生成树--kruskal