很好写的一个prim。
一个小技巧:输入这样的字符主句时最好使用c++中的cin,cin会自动过滤掉空格,而scanf不会,当然些习惯了用scanf或getchar也无所谓,毕竟scanf输入大数据比cin快。本人在很久以前用cin超时用scanf过了一个题之后习惯也是输入用scanf,不过遇到字符就cin。
/*
Hdoj: 1301 Jungle Roads
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#define MaxV 30
#define MaxL 10000
using namespace std;
int map[MaxV][MaxV];
int dis[MaxV];
bool visited[MaxV];
int n;
int Prim()
{
visited[0] = true;
dis[0] = 0;
for(int i = 1; i < n; i++) {
dis[i] = map[0][i];
visited[i] = false;
}
int low_cost = 0;
for(int i = 1; i < n; i++) {
int tmp = MaxL;
int tmp_index = 0;
for(int j = 0; j < n; j++) {
if(!visited[j] && dis[j] < tmp) {
tmp = dis[j];
tmp_index = j;
}
}
visited[tmp_index] = true;
low_cost += tmp;
for(int k = 0; k < n; k++) {
if(!visited[k] && dis[k] > map[tmp_index][k]) {
dis[k] = map[tmp_index][k];
}
}
}
return low_cost;
}
int main()
{
//freopen("data.in", "rb", stdin);
while(scanf("%d", &n) != EOF && n != 0) {
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
map[i][j] = MaxL;
}
}
for(int i = 0; i < n - 1; i++) {
char c;
int k;
cin >> c >> k;
while(k--) {
int m;
cin >> c >> m;
map[i][c-'A'] = map[c-'A'][i] = m;
}
}
printf("%d\n", Prim());
}
return 0;
}