http://acm.hdu.edu.cn/showproblem.php?pid=1301
就是一个最小生成树啦。
目测建立一个map,比建立一个road集合略容易,所以选择了Prim。还是比较基础的。
#include <iostream>
using namespace std;
#define NROADS 78
#define INF 999
int map[NROADS][NROADS],dir[NROADS];
bool visited[NROADS];
int main(){
#ifndef ONLINE_JUDGE
freopen("1301in.txt","r",stdin);
#endif
int n,i,j,a,b,k;
char s,e;
while (scanf("%d",&n)!=EOF&&n){
getchar();
for (i=0;i<n;i++)
for (j=0;j<n;j++)
map[i][j]=INF;
for (i=0;i<n-1;i++){
scanf("%c %d",&s,&j);
getchar();
a=s-'A';
while (j--){
scanf("%c %d",&e,&k);
getchar();
b=e-'A';
map[a][b]=map[b][a]=k;
}
}
for (i=0;i<n;i++){
visited[i]=false;
dir[i]=map[0][i];
}
dir[0]=0;
visited[0]=true;
b=0;
for (i=1;i<n;i++){
k=INF+1;
for (j=0;j<n;j++)
if (!visited[j]&&dir[j]<k){
k=dir[j];
a=j;
}
visited[a]=true;
b+=dir[a];
for (j=0;j<n;j++)
if (!visited[j]&&map[a][j]<dir[j])
dir[j]=map[a][j];
}
printf("%d\n",b);
}
return 0;
}