Prim算法详解请见:CSDN
不过还要考虑重边,害我在洛谷的模板题里错了一次
#include <bits/stdc++.h>
#define MAX 5005
#define INF (int)1e8
using namespace std;
int g[MAX][MAX];
int n,m;
int prim(){
int lowcost[MAX]; //各点到原点的最小距离
int mst[MAX];//边<mst[i], i>是最小生成树的一条边,若mst[i]==0,说明i已经加入到最小生成树中
for (int i = 0; i <= n; ++i) {
lowcost[i] = g[1][i];
mst[i] = 1;
}
lowcost[1] = 0;
mst[1] = 0;
int min,minid;
int sum = 0;
for (int i = 2; i <= n; ++i) {
min = INF;
minid = 0;
for (int j = 2; j <= n; ++j) {
if(lowcost[j] < min && lowcost[j] != 0){
min = lowcost[j];
minid = j;
}
}
if(min == INF)
return -1;
sum += min;
lowcost[minid] = 0;
for (int j = 2; j <= n; ++j) {
if(g[minid][j] < lowcost[j]){
lowcost[j] = g[minid][j];
mst[j] = minid;
}
}
}
return sum;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
g[i][j] = INF;
}
}
int x,y,w;
for (int i = 0; i < m; ++i) {
scanf("%d %d %d", &x, &y, &w);
g[x][y] = min(g[x][y], w); //注意重边!!!
g[y][x] = g[x][y];
}
int ans = prim();
if(ans == -1)
cout << "orz" << endl;
else
cout << ans << endl;
return 0;
}