版权声明:本文为博主原创文章,欢迎转载。如有问题,欢迎指正。 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;
}