转载请注明来自 b0t0w1’blog
prim算法
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
//无穷大
#define MAX 0x3f3f3f3f
//最大结点数
#define SIZE 101
//记录点与点之间距离
int tree[SIZE][SIZE];
//点数与边数
int N,M;
//遍历所有节点最小距离
int total = 0;
int main(){
//读入结点数
scanf("%d%d", &N, &M);
//初始化数组tree[],任意结点距离为无穷大
memset(tree,MAX,sizeof(tree));
//读入边的信息
for (int i = 0; i < M; i++){
int a,b,c;
//a,b为结点序号,c为距离
scanf("%d%d%d", &a, &b, &c);
tree[a][b] = c;
tree[b][a] = c;
}
prim();
printf("%d", total);
return 0;
}
void prim(){
int visit[N + 1];
memset(visit, 0, sizeof(visit));
//准备添加的点
int minpos;
int s[N + 1]; //已添加进来的点
int cnt = 0; //已添加点的个数
s[cnt] = 1; //初始化添加点1到数组s[]
cnt++;
visit[1] = 1;
int m, p;
while(cnt < N){ //直到所有结点进入s[]中
//记录点与点之间最短距离,初始化无穷大
m = MAX;
//遍历s[]中的结点,选出与之距离最小的点
for (int i = 0; i < cnt; i++){
p = s[i];
//遍历和s[i]相连的点
for (int j = 1; j <= N; j++){
//如果未遍历且距离最小
if (!visit[j]&&tree[p][j] < m){
m = tree[p][j];
//记录该点
minpos = j;
}
}
}
//将最小距离加入total
total += m;
//将该点添加到s[]中
s[cnt] = minpos;
cnt++;
visit[minpos] = 1;
}
}
转载请注明来自 b0t0w1’blog