http://poj.org/problem?id=1251
题意:有 N 个村庄, 这些村庄用大写字母“A - Z ”标记,给出某个村庄 分别和 哪些村庄相连, 求这些村庄彼此间能互相直接到达或间接到达的最短距离是多少。
最小生成树模板:
#include<stdio.h> #include<string.h> #include<math.h> #include<queue> #include<algorithm> using namespace std; #define maxn 110 #define oo 0x3f3f3f3f int maps[maxn][maxn], dist[maxn], v[maxn]; int n; void Init() { for(int i=1; i<=26; i++) for(int j=1; j<=26; j++) { if(i==j) maps[i][j]=0; else maps[i][j] = maps[j][i]=oo; } } void Dij() { memset(v, 0, sizeof(v)); int sum = 0; for(int i=1; i<=n; i++) dist[i] = maps[1][i]; v[1] = 1; for(int i=1; i<n; i++) { int index, mins=oo; for(int j=1; j<=n; j++) { if(!v[j] && dist[j]<mins) { index = j; mins = dist[j]; } } sum+=mins; v[index] = 1; for(int j=1; j<=n; j++) { if(!v[j] && dist[j]>maps[index][j]) { dist[j] = maps[index][j]; } } } printf("%d ", sum); } int main() { int m, s; char a[5], b[5]; while(scanf("%d", &n), n) { Init(); for(int i=1; i<n; i++) { scanf("%s %d", a, &m); while(m --) { scanf("%s %d", b, &s); maps[a[0]-'A'+1][b[0]-'A'+1] = maps[b[0]-'A'+1][a[0]-'A'+1] = min(maps[a[0]-'A'+1][b[0]-'A'+1], s); } } Dij(); } return 0; }