Prim算法
Prim算法的本质也是一个贪心的策略,每次贪心的取局部最优解更新数据,直至全局最优
Prim算法讲解
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
int mapp[10005][10005];
int dis[100005];
int flag[100005];
int main() {
memset(flag,0,sizeof(flag));
int N,M;
scanf("%d %d",&N,&M);//N个顶点,M条边
for(int i=1; i<=N; i++) {
for(int j=1; j<=N; j++) {
mapp[i][j]=0x7fffffff;
if(i==j) {
mapp[i][j]=0;
}
}
}
int a,b,c;
for(int i=1; i<=M; i++) {
scanf("%d %d %d",&a,&b,&c);
mapp[a][b]=c;
mapp[b][a]=c;
}
for(int i=1; i<=N; i++) {
dis[i]=mapp[1][i];
}
flag[1]=1;
int sum=0;
for(int i=1; i<N; i++) {
int maxn=0x7fffffff;
int k;
for(int j=1; j<=N; j++) {
if(flag[j]==0&&maxn>dis[j]) {
maxn=dis[j];
k=j;
}
}
flag[k]=1;
sum+=maxn;//计算路径总耗费
for(int j=1; j<=N; j++) {
if(flag[j]==0) {
dis[j]=max(dis[j],mapp[k][j]);
//已添加区域到其他点的距离
//当前节点K到其他节点的距离
//贪心的取最小
}
}
}
printf("Sum = %d\n",sum);
return 0;
}
//测试样例
//6 9
//1 3 1
//1 4 10
//1 6 5
//3 5 3
//3 5 3
//2 6 2
//2 5 1
//2 4 1
//5 4 5