题意:给你一些村庄和到相连村庄的距离,让你求最小连通所有村庄的路径长度。
思路:最小生成树。
我在这里用map建立了一个村庄名到连续数字的映射,由于映射对应关系,这样就需要连续数字从1开始。
#include <cstdio>
#include <map>
#include <string>
#include <iostream>
#include <cstring>
#include <algorithm>
#define MAXN 1000
using namespace std;
struct Edge
{
int a,b,weight;
};
int father[MAXN];
map<string,int> mp;
int find(int p)
{
return p==father[p]?p:(father[p]=find(father[p]));
}
bool cmp(Edge x,Edge y)
{
return x.weight<y.weight;
}
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
mp.clear();
memset(father,0,sizeof(father));
int nn=1,N=0;
Edge p[MAXN];
for(int i=0; i<n-1; ++i)
{
string str,tmp;
int m,val;
cin>>str>>m;
if(!mp[str]) mp[str]=nn++;
for(int j=0; j<m; ++j)
{
cin>>tmp>>val;
if(!mp[tmp]) mp[tmp]=nn++;
p[N].a=mp[str];
p[N].b=mp[tmp];
p[N++].weight=val;
}
}
for(int i=0;i<=nn;++i)
father[i]=i;
sort(p,p+N,cmp);
int ans=0;
for(int i=0;i<N;++i)
{
int ta=find(p[i].a),tb=find(p[i].b);
if(ta!=tb)
{
father[ta]=tb;
ans+=p[i].weight;
}
}
printf("%d\n",ans);
}
return 0;
}