#include <iostream>
#include <stdio.h>
using namespace std;
int main(){
int i,j,begin,end,value,n,m,k;
while(scanf("%d",&n)&&n!=0){
int map[105][105]={0},min;
int v[55]={0},a[55]={0};
int val=0,num=1;
scanf("%d",&m);
for(i=1;i<=m;i++){
scanf("%d %d %d",&begin,&end,&value);
if(!map[begin][end]&&!map[end][begin]){
map[begin][end]=value;
map[end][begin]=value;
}
if(value<map[begin][end]){
map[end][begin]=map[begin][end]=value;
}
}
a[0]=1;
v[1]=1;
while(num<n){
min=1000000;
for(i=0;i<num;i++){
for(j=2;j<=n;j++){
if(!v[j]&&min>map[a[i]][j]&&map[a[i]][j]!=0){
min=map[a[i]][j];
k=j;
}
}
}
v[k]=1;
a[num]=k;
num++;
val=val+min;
}
if(num==n){
printf("%d\n",val);
}
}
return 0;
}
ACM暑期集训——专题一[最小生成树prim算法]
最新推荐文章于 2024-07-19 15:45:46 发布