Prim就是像Dijkstra一样维护一个数组d,该数组是每个结点对于最小生成树的最短距离。
/**
* HDU1301
* Prim练习
*/
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int mmax = 30;
const int INF = 0x3f3f3f3f;
int map[mmax][mmax];
int book[mmax];
int d[mmax];
int main()
{
int t;
while(scanf("%d", &t) && t)
{
memset(book, 0, sizeof(book));
int sum = 0;
for(int i = 0; i < mmax; i++)
{
for(int j = 0; j < 30; j++)
{
if(i == j)
map[i][j] = 0;
else
map[i][j] = INF;
}
}
char s[3];
int road;
for(int i = 0; i < t-1; i++)
{
scanf("%s %d", s, &road);
int start = s[0] - 'A';
int end;
int w;
for(int k = 0; k < road; k++)
{
scanf("%s %d", s, &w);
end = s[0] - 'A';
map[start][end] = w;
map[end][start] = w;
}
}
// for(int i = 0; i < t; i++)
// {
// for(int j = 0; j < t; j++)
// {
// printf("%d " ,map[i][j]);
// }
// printf("\n");
// }
for(int i = 0; i < t; i++)
{
d[i] = map[0][i];
}
book[0] = 1;
for(int i = 1; i < t; i++)
{
int min = INF;
int mini;
for(int k = 0; k < t; k++)
{
if(d[k] < min && book[k] == 0)
{
min = d[k];
mini = k;
}
}
book[mini] = 1;
sum += min;
for(int k = 0; k < t; k++)
{
if(book[k] == 0 && d[k] > map[mini][k])
d[k] = map[mini][k];
}
}
printf("%d\n", sum);
}
return 0;
}