Prim算法思路:
1、不断地从剩下的结点找权值最小的点,加入mst
2、往mst中加入结点后,更新剩余结点的lowcost值
Prim算法数据结构选择:
1、lowcost[i]:以i为终点的边的最小权值
2、mst[i]:对应lowcost[i]的起点,即说明边<mst[i],i>是MST的一条边
lowcost[i]=mst[i]=0表示点i已加入到MST中
- 注:如果无需打印出最小生成树,那么可以不用设立mst[]数组!
坑点:
本处参考了该博主博客
但注意,其实应该是题目给的条件有问题
它说ci>=1的
其实不然 测试数据中ci其实是有可能为0的
所以说 dist被走过了就要赋值为-1 而不是0哦哦!!!!!
代码如下
#include<iostream>
#include<climits>
using namespace std;
const int N = 1005;
int map[N][N],lowcost[N];
int n,m;
int prim(){
int sum = 0;
for(int i = 2; i <= n; i++){
lowcost[i] = map[1][i];
}
lowcost[1]=-1;
for(int i = 2; i <= n; i++){
int minn = INT_MAX;int minId = 0;
for(int j = 2; j <= n; j++){
if(lowcost[j] < minn&&lowcost[j] != -1){
minn = lowcost[j];
minId = j;
}
}
sum += minn;
lowcost[minId] = -1;
for(int j = 2; j <= n; j++){
if(map[minId][j] < lowcost[j]){
lowcost[j] = map[minId][j];
}
}
}
return sum;
}
int main()
{
int a,b,c;
scanf("%d%d", &n, &m);
fill(map[0], map[0]+N*N, INT_MAX);
for(int i = 0; i < m; i++){
scanf("%d%d%d", &a, &b, &c);
map[a][b]=map[b][a]=c;
}
int ans = prim();
printf("%d", ans);
return 0;
}