#include <stdio.h>
const int Max=0x7fffffff;
int n, map[28][28], dis[28], used[28] ;
int Prim( )
{
int i, j, index, len, min;
len=0;
for( i=1; i<=n; ++i){
dis[i] = map[1][i] ;
used[i] =0;
}
used[1] =1;
for( i=1; i<n; ++i){
min= Max;
//找到所有与已标记过的点相连的边中,权值最小的边
for( j=1; j<=n; ++j){
if( !used[j] && min>dis[j] ){
index= j;
min= dis[j] ;
}
}
used[index] =1;
len+= dis[index] ;
//更新所有与已找到的点相连的边的信息
for( j=1; j<=n; ++j){
if( !used[j] && dis[j]>map[index][j] )
dis[j] = map[index][j] ;
}
}
return len;
}
intmain()
{
int i, j, d, geshu, weight;
char ch, to;
while( scanf("%d", &n) && n){
for( i=1; i<=n; ++i){
for( j=1; j<=n; ++j){
map[i][j] = Max;
}
}
for( i=1; i<n; ++i){
getchar() ;
scanf("%c %d", &ch, &geshu) ;
for( j=1; j<=geshu; ++j){
scanf(" %c %d", &to, &weight) ;
map[i][to-64] = map[to-64][i] = weight;
}
}
printf("%d\n", Prim( ) ) ;
}
return0;
}
HDU : 1301 ( Jungle Roads ) 最小生成树mst prim算法
最新推荐文章于 2019-03-31 17:16:36 发布