最小生成树模板——Prim算法

版权声明:本文为博主原创文章,欢迎转载。如有问题,欢迎指正。 https://blog.csdn.net/weixin_42172261/article/details/87169140

Prim算法优先试用于稠密图
一开始n个点相互独立,如果要让n个点相互连通,那么让这n个点都依次进入树里面。
从任意一点开始构造生成树,这里先从1点开始,让1点入树,book标记,dis标记到的最短距离,然后遍历n个点,找到到树的最短距离,这个点入树,标记,然后更新dis数组,直到所有点都入树。

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int e[105][105], dis[105], book[105]={0};
int inf=99999999;
int n, m, i, j, k;
 
int main()
{
	int count=0, sum=0;
	scanf("%d%d", &n, &m);
	for (i=1; i<=n; i++)//先对图进行处理,可到达0,不可到达inf 
		for (j=1; j<=m; j++)
			if (i==j)	e[i][j]=0;
			else	e[i][j]=inf;
	
	for (i=1; i<=m; i++){
		int u, v, w;
		scanf("%d%d%d", &u, &v, &w);
		e[u][v]=w;//无向图 
		e[v][u]=w;
	}
	
	for (j=1; j<=n; j++)//先让1点进树 
		dis[j]=e[1][j];
	
	book[1]=1;
	count++;
	while (count<n){//当n个点全jin树后完成 
		int min=inf;
		for (i=1; i<=n; i++){//找距离树的最短的点 
			if (book[i]==0 && dis[i]<min){
				min=dis[i];
				j=i;
			}
		}
		book[j]=1;
		count++;
		sum+=dis[j];
		
		for (k=1; k<=n; k++){//更新dis 
			if (book[k]==0 && dis[k]>e[j][k])
				dis[k]=e[j][k];
		}
	}
	printf("%d", sum);//sum为这棵树边权之和 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42172261/article/details/87169140
今日推荐