Kruscal初始每一个节点为一个森林,每次选最短的边连接两个不同森林;
prime初始为由一个节点开始的一棵树,每次从不在树中的顶点中,选出一个 连接到树中边最小的那个 顶点;
#include<climits>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int m[1005][1005]; //图的矩阵表示
int key[1005]; //key[i]代表 连接节点 i 和当前树中节点 所有边中 的最小边权值
bool visit[1005]; //代表一个节点是否已经在树中
int main() {
int N;
while (cin >> N) {
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
cin >> m[i][j];
int ans = 0;
//prime 算法,以0节点为根节点(初始节点,可任意选)
for (int i = 0; i < N; ++i) //初始化 每一个节点到树中的距离
key[i] = m[0][i];
visit[0] = true;
int k = N - 1;
while (k--) { //每次取一个节点,取N-1次即可
int v, min_dis = INT_MAX;
for (int i = 0; i < N; ++i) //从不在树中的节点中,选出 key值最小的节点v
if (visit[i] == false && key[i] < min_dis) {
v = i;
min_dis = key[i];
}
ans += key[v];
visit[v] = true;
for (int i = 0; i < N; ++i) // 更新每一个节点到树中的距离
//key[i]为 v加入树之前,i连接到树的最短边的值,现在v节点也加入树中
//那么 i 节点连接到树 的最短边为 (key[i]) 与 (i到v节点距离 )中的小者
if (visit[i] == false && key[i] > m[v][i])
key[i] = m[v][i];
}
cout << ans << endl;
}
return 0;
}