欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

最小生成树--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
相关标签: 刷题的日常