http://acm.hdu.edu.cn/showproblem.php?pid=1233
#include<iostream>
#include<cstdio>
using namespace std;
int mat[110][110],dist[110],n;
bool visited[110];
// 寻找V-U中未被访问,且dist最小的顶点
int MinVertex( )
{
int k = -1;
int minValue=INT_MAX;
for (int i = 0; i<n; i++)
{
if (dist[i] < minValue && visited[i]==false)
{
minValue=dist[i];
k = i;
}
}
return k;
}
//辅助数组保存了最小生成树的完整信息,其中dist之和就是MST的代价, adjvex则给出了MST的构造情况。
void Prim(int u)
{ //从顶点u出发构造网的最小生成树
// 辅助数组初始化
int i;
for(i=0; i<n; i++)
{
dist[i]=mat[u][i];
}
fill(visited, visited+n, false);
visited[u] = true; // 初始,U={u}
for(int v=1; v<n; v++)
{ // 选择vexnum-1个顶点(边)
int k=MinVertex( ); // 加入生成树的下一个顶点(k)
visited[k] = true; // 新节点加入集合U
// 调整集合V-U中剩余顶点到集合U的最短距离
for (i=0; i<n; i++)
{
if (visited[i]==false && mat[k][i]<dist[i])
{
dist[i]= mat[k][i];
}
}
}
}
int main()
{
int m,sum,a,b,c,i;
while(scanf("%d",&n),n)
{
m=n*(n-1)/2;
fill(&mat[0][0],&mat[n][n],INT_MAX);
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
a--;
b--;
mat[a][b]=mat[b][a]=c;
}
Prim(0);
sum=0;
for(i=1;i<n;i++)sum+=dist[i];
printf("%d\n",sum);
}
return 0;
}