Prim算法是求最小生成树(MST)的经典贪心算法,属于图论中的核心考点。和Kruskal按边排序不同,Prim是从一个顶点出发,逐步扩展:每次从"已选集合"到"未选集合"的边中,挑一条最短的加入。
易错点:Prim的 lowcost[i] 数组含义是"顶点 i 到已选集合的最短距离",每次更新时只和新加入的顶点比较,而不是和所有已选顶点比较——因为之前已经是最优的了。
过程:0→1(2) → 1→2(3) → 2→3(1) = 2+3+1 = 6 ✅
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int main() {
int n; cin >> n;
vector<vector<int>> g(n, vector<int>(n));
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> g[i][j]; // 读入邻接矩阵
vector<int> lowcost(n, INT_MAX); // 到已选集合的距离
vector<bool> inMST(n, false); // 是否在MST中
lowcost[0] = 0;
int ans = 0;
for (int i = 0; i < n; i++) {
int u = -1;
for (int j = 0; j < n; j++) // 找最小lowcost
if (!inMST[j] && (u == -1 || lowcost[j] < lowcost[u]))
u = j;
inMST[u] = true;
ans += lowcost[u];
for (int j = 0; j < n; j++) // 用u更新
if (!inMST[j] && g[u][j] && g[u][j] < lowcost[j])
lowcost[j] = g[u][j];
}
cout << ans << endl;
return 0;
}