Jungle Roads 基礎最小生成樹★
阿新 • • 發佈:2018-12-16
#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; } }