#include <iostream>
using namespace std;
#define MAXN 100
#define INF 100000
int cost[ MAXN ][ MAXN ];
int closet[ MAXN ];
int lowcost[ MAXN ];
int N;
int prim(int v0)
{
int ans = 0;
int mindis, minone;
for(int i = 0; i < N; i ++)
{
closet[ i ] = v0;
lowcost[ i ] = cost[ v0 ][ i ];
}
for(int i = 0; i < N - 1; i ++)
{
mindis = INF;
for(int j = 0; j < N; j ++)
{
if(lowcost[ j ] < mindis && lowcost[ j ] != 0)
{
mindis = lowcost[ j ];
minone = j;
}
}
ans += lowcost[ minone ];
lowcost[ minone ] = 0;
for(int j = 0; j < N; j ++)
{
if(lowcost[ j ] > cost[ j ][ minone ])
{
lowcost[ j ] = cost[ j ][ minone ];
closet[ j ] = minone;
}
}
}
return ans;
}
int main()
{
int f, t, d;
while(scanf("%d", &N))
{
if(N == 0)
{
break;
}
for(int i = 0; i < (N * (N - 1)) / 2; i ++)
{
scanf("%d %d %d", &f, &t, &d);
cost[ f - 1 ][ t - 1 ] = d;
cost[ t - 1 ][ f - 1 ] = d;
}
for(int i = 0; i < N; i ++)
{
cost[ i ][ i ] = 0;
}
printf("%d\n", prim(0));
}
return 0;
}
杭电ACM1233(最小生成树)
最新推荐文章于 2019-06-01 11:33:00 发布