思路:
1.从未选节点集合中选择到已选节点距离最近的点;
2.用该点更新未选节点到已选节点集合的距离;
3.不断循环2。
#include<stdio.h>
#include<string.h>
#include<string>
#include<algorithm>
#include<iostream>
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<math.h>
#include<stdlib.h>
using namespace std;
#define M 110
#define MAX 2e20
int dis[M][M],n;
void prim()
{
int i,j,k,ans=0,tmp,lowcost[M*M];
lowcost[0]=0;//初始化将0节点纳入
for(i=1;i<n;i++)//初始化未选节点到已选节点(目前只有0)的距离
{
lowcost[i]=dis[0][i];
}
for(i=1;i<n;i++)
{
int mi=MAX;
for(j=0;j<n;j++)//从未选节点中选择距离已选节点最近的点
{
if(mi>lowcost[j]&&lowcost[j]!=0)
{
mi=lowcost[j];
tmp=j;
}
}
ans+=mi;
lowcost[tmp]=0;
for(j=0;j<n;j++)//用该点更新为选节点到已选节点集合的距离
{
if(lowcost[j]>dis[tmp][j])
{
lowcost[j]=dis[tmp][j];
}
}
}
printf("%d\n",ans);
}
int main()
{
int i,j,k,e,a,b;
while(scanf("%d",&n),n)
{
e=n*(n-1)/2;
for(i=0;i<e;i++)
{
scanf("%d%d%d",&a,&b,&k);
a--;b--;
dis[a][b]=dis[b][a]=k;
}
prim();
}
return 0;
}