#include<bits/stdc++.h>
using namespace std;
int Father[1001];
int ans = 0;
struct Edg {
int u, v; int e;
bool operator < (const Edg &p)const { return e < p.e; }
}edg[1000];
int FindFather(int x) { return Father[x] < 0 ? x : FindFather(Father[x]); }
void Umerge(Edg x)
{
int Fx = FindFather(x.u);
int Fy = FindFather(x.v);
if (Fx != Fy)
{
Father[Fy] += Father[Fx];
Father[Fx] = Fy;
ans += x.e;
}
}
int main() {
char tmp1, tmp2;
int count = 0;
int m;
int n;
while (cin >> n && n)
{
int cnt = 0;
memset(Father, -1, sizeof(Father));
memset(edg, 0, sizeof(edg));
for (int i = 0; i < n-1; ++i)
{
cin >> tmp1 >> m;
for (int j = 0; j < m; ++j)
{
cin >> tmp2 >> edg[cnt].e;
edg[cnt].u = tmp1 ;
edg[cnt].v = tmp2 ;
cnt++;
}
}
sort(edg, edg + cnt);
for (int i = 0; i < cnt; ++i) Umerge(edg[i]);
for (int i = 1; i <= 1000; ++i)
if (Father[i] < 0)
count++;
count == 1 ? printf("?\n") : printf("%d\n", ans);
ans = 0;
}
}
Jungle Roads 基础最小生成树★
猜你喜欢
转载自blog.csdn.net/qq_31741481/article/details/83276146
今日推荐
周排行