【Prim】最小生成树

【Prim】

模版题 https://www.acwing.com/file_system/file/content/whole/index/content/4385/

思路

(1)朴素版Prim:
dist[i] <- 正无穷
for(i=0;i<n;i++){
	t<-找到集合外距离最近的点
	用t更新其他点:到集合的距离
	st[t]=true
}

image

模版代码

#include<bits/stdc++.h>
using namespace std;
const int N=510,INF=0x3f3f3f3f;
//稠密图用邻接矩阵
int n,m;
int g[N][N];
int dist[N];
bool st[N];
int prim(){
	memset(dist,0x3f,sizeof dist);
	int res=0;//求权重和 
	for(int i=0;i<n;i++){
		int t=-1;//当前距离最小的点 
		for(int j=1;j<=n;j++){
			//在集合外  当前没找到任何一个点/距离更小 
			if(!st[j]&&(t==-1 || dist[t]>dist[j])) t=j;
		}
		if(i && dist[t]==INF){//不是根节点/当前图不连通 
			return INF;
		}
		if(i) res+=dist[t];//先累加在更新->处理自环 
		//用该点更新到其他点的距离 
		for(int j=1;j<=n;j++){
			dist[j]=min(dist[j],g[t][j]);//这个点到集合的距离 
		}
		st[t]=true;
	}
	return res;
}
int main(){
	scanf("%d%d",&n,&m);
	memset(g,0x3f,sizeof g);
	while(m--){
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		g[a][b]=g[b][a]=min(g[a][b],c);//处理重边 
	}
	int t=prim();
	if(t==INF) puts("impossible");
	else printf("%d\n",t);
	return 0;
}
posted @ 2025-01-12 13:01  White_ink  阅读(13)  评论(0)    收藏  举报