
9 A 2 B 12 I 25 B 3 C 10 H 40 I 8 C 2 D 18 G 55 D 1 E 44 E 2 F 60 G 38 F 0 G 1 H 35 H 1 I 35 3 A 2 B 10 C 40 B 1 C 20 0
216 30
AC代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define INF 0x7fffffff
using namespace std;
int map[30][30], vis[30], dis[30];
int n;
void prim()
{
for(int i=1; i<=n; i++)
{
dis[i] = map[1][i];
}
dis[1] = 0; vis[1] = 1;
int sum = 0, pos;
for(int i=1; i<n; i++)
{
int tmp = INF;
for(int j=1; j<=n; j++)
{
if(!vis[j] && dis[j]!=-1 && dis[j]<tmp)
{
tmp = dis[j];
pos = j;
}
}
sum += tmp;
vis[pos] = 1;
for(int i=1; i<=n; i++)
if(!vis[i] && (map[pos][i] < dis[i] || dis[i] == -1) && map[pos][i] != -1)
dis[i] = map[pos][i];
}
printf("%d\n", sum);
}
int main()
{
char a[3], b[3];
int m, w;
while(scanf("%d", &n)==1 && n)
{
memset(map, -1, sizeof(map)); //把这里赋值为-1的做法
memset(dis, -1, sizeof(dis)); //把这里赋值为-1的做法
memset(vis, 0, sizeof(vis));
for(int i=0; i<n-1; i++)
{
scanf("%s %d", a, &m);
for(int i=0; i<m; i++)
{
scanf("%s %d", b, &w);
map[a[0]-64][b[0]-64] = w;
map[b[0]-64][a[0]-64] = w;
}
}
prim();
}
return 0;
}
HDU - 1301 - Jungle Roads (最小生成树!!prim算法!!)
原文:http://blog.csdn.net/u014355480/article/details/42274653