程序说明
prim算法,注意有重边(此题大坑 !),因此每次输入权值后要进行比较。另外自回环也应该排除在外。用一个cnt变量累加计算权值之和,G[adj[k]][k]表示生成树的路径的权值。(k表示纳入生成树的顶点的下标,adj[k]表示与k相邻的顶点的下标)
数据里貌似没有出现非连通图??没有输出orz也能过。。
代码如下:
#include <iostream>
#define MAX 5000
#define INF 65535
using namespace std;
int G[MAX][MAX];
int n, m, x, y, z, k, cnt;
int adj[MAX];
int lowcost[MAX];
int main() {
cin>>n>>m;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++) {
G[i][j] = INF;
if(i == j)
G[i][j] = 0;
}
for(int i = 0; i < m; i++) {
cin>>x>>y>>z;
if(z < G[x-1][y-1] && x != y) {
G[x-1][y-1] = z;
G[y-1][x-1] = G[x-1][y-1];
}
else
continue;
}
//prim算法
int i, j, k;
for(int i = 0; i < n; i++) {
lowcost[i] = G[0][i];
adj[i] = 0;
}
lowcost[0] = 0;
for(i = 1; i < n; i++) {
int min = INF;
k = 0;
for(j = 1; j < n; j++) {
if(min > lowcost[j] && lowcost[j] != 0) {
min = lowcost[j];
k = j;
}
}
cnt += G[adj[k]][k];
lowcost[k] = 0;
for(j = 1; j < n; j++) {
if(lowcost[j] > G[k][j] && lowcost[j] != 0) {
lowcost[j] = G[k][j];
adj[j] = k;
}
}
}
cout<<cnt;
return 0;
}