题目见上一篇博客
#include<cstdio>
#include<cstring>
#define MAXN 55
#define MAXINT 0x7fffffff
int graph[MAXN][MAXN]; //邻接矩阵
bool visited[MAXN]; //判断每个点是否被访问过
int prim(int n)
{
int lowCost[MAXN]; //最短路径集合
int i,j;
for(int i=1;i<=n;++i)
lowCost[i]=graph[1][i]; //从第一个点开始
memset(visited,false,sizeof(visited));
visited[1]=true;
lowCost[0]=MAXINT;
int sum=0;
for(int i=1;i<n;++i)
{
int pos=0;
for(j=1;j<=n;++j)
{
if(!visited[j]&&lowCost[pos]>lowCost[j])
pos=j;
} //寻找最短路径
if(pos==0)
break;
sum+=lowCost[pos];
visited[pos]=true;
for(j=1;j<=n;++j)
{
if(!visited[j]&&graph[pos][j]<lowCost[j])
lowCost[j]=graph[pos][j]; //更新
}
}
return sum;
}
int main()
{
int i,j;
int num,routenum;
while(scanf("%d",&num)&&num){
scanf("%d",&routenum);
for(i=0;i<MAXN-1;++i) //不相连的结点距离全部置为正无穷
for(int j=0;j<MAXN-1;++j)
graph[i][j]=MAXINT;
for(i=0;i<routenum;++i)
{
int a,b,len;
scanf("%d%d%d",&a,&b,&len);
if(graph[a][b]>len)
graph[a][b]=graph[b][a]=len;
}
int sum=prim(num);
printf("%d\n",sum);
}
return 0;
}