最小生成树的问题,数据量比较小,用dij算法,把所有路径的按照长度从小到大进行排列,设置一个并查集确定两个地点是否已经连接在一起了。
P.S. Priority Queue有毒…
#include <cstdio>
#include <memory.h>
#include <algorithm>
#include <iostream>
using namespace std;
#define maxp 30
#define maxr 80
struct road{
int u,v;
int dis;
};
bool operator < (road a,road b){
return a.dis < b.dis;
}
int array_[maxp]={0};
road map[maxr]={0};
int loc = 0;
int find(int k){
return array_[k]==k?k:find(array_[k]);
}
int main(){
int n;
while(cin>>n){
if(!n)
break;
memset(map,0,sizeof(map));
loc = 0;
for(int i=0;i<maxp;++i)
array_[i] = i;
for(int i=0;i<n-1;++i){
char p1;
int num;
cin>>p1>>num;
for(int j=0;j<num;++j){
char p2;
int dis;
cin>>p2>>dis;
road temp;
temp.u = int(p1-'A');
temp.v = int(p2-'A');
temp.dis = dis;
map[loc++] = temp;
}
}
sort(map,map+loc);
int ans = 0;
for(int i=0;i<loc;++i){
int x = find(map[i].u);
int y = find(map[i].v);
if(x==y){
continue;
}
else{
ans += map[i].dis;
array_[y]=x;
}
}
printf("%d\n",ans);
}
//system("pause");
return 0;
}