思路:模板题..由于SB把初始化写成了并查集的初始化找了好久错...
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
using namespace std;
#define maxn 100
#define LL long long
int cas=1,T;
int pre[maxn];
struct Edge
{
int u,v;
int dist;
Edge(){}
Edge(int u,int v,int dist):u(u),v(v),dist(dist){}
bool operator < (const Edge &rhs)const
{
return dist < rhs.dist;
}
};
int Find(int x)
{
return pre[x] == -1? x: pre[x]=Find(pre[x]);
}
int n,m;
Edge edges[maxn];
void init()
{
m=0;
memset(pre,-1,sizeof(pre));
// edges.clear();
for (int i = 0;i<maxn;i++)
{
edges[i].u=0;
edges[i].v=0;
edges[i].dist=0;
}
}
void AddEdge(int u,int v,int dist)
{
edges[m++]=Edge(u,v,dist);
}
int Kruskal()
{
int sum = 0;
int cnt = 0;
sort(edges,edges+m);
for (int i = 0;i<m;i++)
{
// printf("%d\n",i);
int fx = edges[i].u;
int fy = edges[i].v;
// printf("%d %d",u,v);
if (Find(fx)!=Find(fy))
{
sum+=edges[i].dist;
// printf("%d\n",sum);
pre[Find(fx)] = Find(fy);
if (++cnt >=n-1)
{
// puts("YES");
break;}
}
}
return cnt>=n-1?sum:-1;
}
int main()
{
//freopen("in","r",stdin);
//scanf("%d",&T);
while (scanf("%d",&n) && n)
{
init();
for (int i = 0;i<n-1;i++)
{
char c;
int mm;
cin >> c >> mm;
// cout << c << " " << mm;
int uu = c-'A';
for (int j=0;j<mm;j++)
{
int d;
cin >> c >>d;
int vv = c-'A';
AddEdge(uu,vv,d);
}
}
int ans = Kruskal();
printf("%d\n",ans);
}
//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
return 0;
}