1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
| #include<bits/stdc++.h> using namespace std; int n, m, s, deg, ans; int a[32][32], d[32], conn[32]; bool v[32], c[32]; int tree[32][32]; int ver[32], p; int f[32], fx[32], fy[32];
void read() { map<string, int> h; cin >> m; h["Park"] = 1; n = 1; memset(a, 0x3f, sizeof(a)); for (int i = 1; i <= m; i++) { int x, y, z; char sx[12], sy[12]; scanf("%s%s%d", sx, sy, &z); if (!h[sx]) h[sx] = ++n; if (!h[sy]) h[sy] = ++n; x = h[sx], y = h[sy]; a[x][y] = min(a[x][y], z); a[y][x] = min(a[y][x], z); } cin >> s; }
void prim(int root) { d[root] = 0; for (int i = 1; i <= p; i++) { int x = 0; for (int j = 1; j <= p; j++) if (!v[ver[j]] && (x == 0 || d[ver[j]] < d[x])) x = ver[j]; v[x] = true; for (int j = 1; j <= p; j++) { int y = ver[j]; if (!v[y] && d[y] > a[x][y]) d[y] = a[x][y], conn[y] = x; } } int closest = root; for (int i = 1; i <= p; i++) { int x = ver[i]; if (root == x) continue; ans += d[x]; tree[conn[x]][x] = tree[x][conn[x]] = d[x]; if (a[1][x] < a[1][closest]) closest = x; } deg++; ans += a[1][closest]; tree[1][closest] = tree[closest][1] = a[1][closest]; }
void dfs(int x) { ver[++p] = x; c[x] = true; for (int y = 1; y <= n; y++) if (a[x][y] != 0x3f3f3f3f && !c[y]) dfs(y); }
void prim_for_all_comp() { memset(d, 0x3f, sizeof(d)); memset(v, 0, sizeof(v)); memset(tree, 0x3f, sizeof(tree)); c[1] = true; for (int i = 2; i <= n; i++) if (!c[i]) { p = 0; dfs(i); prim(i); } }
void dp(int x) { v[x] = true; for (int y = 2; y <= n; y++) if (tree[x][y] != 0x3f3f3f3f && !v[y]) { if (f[x] > tree[x][y]) { f[y] = f[x]; fx[y] = fx[x], fy[y] = fy[x]; } else { f[y] = tree[x][y]; fx[y] = x, fy[y] = y; } dp(y); } v[x] = false; }
bool solve() { int min_val = 1 << 30, mini; for (int i = 2; i <= n; i++) { if (tree[1][i] != 0x3f3f3f3f || a[1][i] == 0x3f3f3f3f) continue; if (a[1][i] - tree[fx[i]][fy[i]] < min_val) { min_val = a[1][i] - tree[fx[i]][fy[i]]; mini = i; } } if (min_val >= 0) return false; ans += min_val; tree[1][mini] = tree[mini][1] = a[1][mini]; tree[fx[mini]][fy[mini]] = tree[fy[mini]][fx[mini]] = 0x3f3f3f3f; f[mini] = a[1][mini]; fx[mini] = 1, fy[mini] = mini; v[1] = true; dp(mini); return true; }
int main() { read(); prim_for_all_comp(); memset(v, 0, sizeof(v)); dp(1); while (deg < s) { if (!solve()) break; deg++; } printf("Total miles driven: "); cout << ans << endl; }
|