1 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int MAXN = 300; int n; int W[MAXN + 5]; struct Edge { int u, v, w; }; vector<Edge> e; bool cmp(Edge x, Edge y) { return x.w < y.w; } int fa[MAXN + 5]; int findFa(int x) { if (x == fa[x]) return x; return fa[x] = findFa(fa[x]); } signed main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n; for (int i = 1; i <= n; i++) cin >> W[i]; for (int u = 1; u <= n; u++) for (int v = 1; v <= n; v++) { int w; cin >> w; if (u < v) e.push_back({u, v, w}); } // 所谓的井,可以看作是有一个超级井到每个点有一条长度为 W[i] 的边 for (int i = 1; i <= n; i++) e.push_back({n + 1, i, W[i]}); n++; for (int i = 1; i <= n; i++) fa[i] = i; int ans = 0; sort(e.begin(), e.end(), cmp); for (int i = 0; i <= (int)e.size() - 1; i++) { int u = e[i].u, v = e[i].v, w = e[i].w; int faU = findFa(u); int faV = findFa(v); if (faU == faV) continue; fa[faU] = faV; ans += w; } cout << ans; return 0; }
- 1
信息
- ID
- 2345
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 23
- 已通过
- 13
- 上传者