基础的最短路,只是初始化麻烦一些。。
不过刚开始老 TEL。。看了discuss 。。才知道数据有问题。。呃。。 改成cin 和cout 就过了。。不过。。。是有空该好好学学C++了= =
//252K 0MS
#include <stdio.h>
#include <iostream>
#include <cstdio>
#define MAX_COST 105
#define N 28
#define DEBUG puts("debug")
using namespace std ;
int dis_betw[N][N] ;
int low_dis[N] ;
int flag[N] ;
void Init_Dis_Betw ( )
{
int i ;
for ( i = 0 ; i < N ; i ++ )
{
int j ;
for ( j = 0 ; j < N ; j ++ )
{
dis_betw[i][j] = MAX_COST ;
}
}
}
void Init_Flag_And_Low_Dis ( )
{
int i ;
for ( i = 0 ; i < N ; i ++ )
{
flag[i] = 0 ;
low_dis[i] = MAX_COST ;
}
}
void Reachable_Matrix ( int const n )
{
int i ;
for ( i = 1 ; i <= n-1 ; i ++ )
{
char row ;
cin >> row ;
int row_index ;
row_index = row - 'A' + 1 ;
int count ;
//scanf ("%d" , & count ) ;
cin >> count ;
// getchar ( ) ;
while ( count -- )
{
char rank ;
//scanf ("%c" , & rank ) ;
cin >> rank ;
int rank_index ;
rank_index = rank - 'A' + 1 ;
int length ;
//scanf ("%d" , & length ) ;
cin >> length ;
// getchar ( ) ;
dis_betw[row_index][rank_index] = dis_betw[rank_index][row_index] = length ;
}
}
}
void Prime ( int const n )
{
int s ;
s = 1 ;
Init_Flag_And_Low_Dis ( ) ;
flag[1] = 1 ;
int prim_weight ;
prim_weight = 0 ;
int m ;
m = 1 ;
int new_point ;
int new_weight ;
while ( m < n )
{
new_weight = MAX_COST ;
int i ;
for ( i = 1 ; i <= n ; i ++ )
{
if ( 0 == flag[i] && low_dis[i] > dis_betw[s][i] )
{
low_dis[i] = dis_betw[s][i] ;
}
if ( 0 == flag[i] && new_weight > low_dis[i] )
{
new_weight = low_dis[i] ;
new_point = i ;
}
}
s = new_point ;
flag[s] = 1 ;
prim_weight += new_weight ;
m ++ ;
}
cout << prim_weight << endl ;
}
int
main ( )
{
int n ;
while ( 1 )
{
cin >> n ;
if ( 0 == n )
{
break ;
}
// getchar ( ) ;
Init_Dis_Betw ( ) ;
Reachable_Matrix ( n ) ;
Prime ( n ) ;
}
return 0 ;
}