算法导论看得我真的很蛋疼,都怪自己平时看得书少,这题纯粹是参考别人代码得出来,自己还不是很明白
有一点想说的是,这里并不需要维护父结点
#include<iostream>
#define N 105
#define MAX 0x7fffffff
using namespace std;
int n;
int map[N][N];
bool used[N];
//int father[N];
int dis[N];
int Mst_prim(){
int res = 0;
for(int i = 1;i <= n;i++){
dis[i] = map[1][i];
used[i] = false;
}
used[1] = true;
for(int i = 1;i < n;i++){
int min = MAX;
int k;
for(int j = 1;j <= n;j++){
if(!used[j] && dis[j] < min){
min = dis[j];
k = j;
}
}
used[k] = true;
res += dis[k];
for(int j =1;j <= n;j++){
if(!used[j] && map[k][j] < dis[j]){
dis[j] = map[k][j];
}
}
}
return res;
}
int main()
{
while(scanf("%d",&n)==1 && n){
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
map[i][j] = MAX;
}
}
int temp = n*(n-1)/2;
for(int i = 1;i <= temp;i++){
int x,y,dis;
scanf("%d %d %d",&x,&y,&dis);//cin >>x >>y >>dis;
map[x][y] = map[y][x] = dis;
}
cout <<Mst_prim() <<endl;
}
return 0;
}