- [CSP-S 2025]道路修复 / road
code
- @ 2026-2-13 11:49:11
struct Dsu {
vector<int> f;
Dsu(int n) {
f.assign(n + 1, 0);
iota(f.begin(), f.end(), 0);
}
int fa(int u) {
return u == f[u] ? u : f[u] = fa(f[u]);
}
void merge(int u, int v) {
f[fa(u)] = fa(v);
}
int same(int u, int v) {
return fa(u) == fa(v);
}
};
void solve() {
int n, m, k;
cin >> n >> m >> k;
#define a3 array<ll, 3>
vector<a3> e(m);
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
e[i] = {w, u, v};
}
vector a(k, vector<int>(n + 1));
vector<int> c(k), mnid(k, 1);
for (int i = 0; i < k; i++) {
cin >> c[i];
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
if (a[i][j] < a[i][mnid[i]]) {
mnid[i] = j;
}
}
}
ll ans = 0;
sort(e.begin(), e.end());
Dsu dsu(n);
vector<a3> ne;
for (auto [w, u, v] : e) {
if (dsu.same(u, v)) continue;
ne.push_back({w, u, v});
dsu.merge(u, v);
ans += w;
}
vector ke(k, vector<a3>());
for (int i = 0; i < k; i++) {
for (int u = 1; u <= n; u++) {
ke[i].push_back({a[i][u], mnid[i], u});
}
sort(ke[i].begin(), ke[i].end());
}
for (int x = 0; x < 1 << k; x++) {
ll res = 0;
vector<reference_wrapper<vector<a3>>> vec; vec.push_back(ne);
for (int i = 0; i < k; i++) {
if (x >> i & 1) {
res += c[i] + a[i][mnid[i]];
vec.push_back(ke[i]);
}
}
Dsu dsu(n);
priority_queue<a3, vector<a3>, greater<a3> > q;
for (int i = 0; i < vec.size(); i++) {
q.push((a3){vec[i].get()[0][0], i, 0});
}
int cnt = 0;
while (q.size()) {
auto [_, ik, i] = q.top(); q.pop();
auto [w, u, v] = vec[ik].get()[i];
if (i + 1 < vec[ik].get().size()) {
q.push((a3){vec[ik].get()[i + 1][0], ik, i + 1});
}
if (dsu.same(u, v)) continue;
dsu.merge(u, v);
res += w;
if (++cnt == n - 1) break;
}
ans = min(ans, res);
}
cout << ans << '\n';
}
0 条评论
目前还没有评论...
信息
- ID
- 462
- 时间
- ms
- 内存
- MiB
- 难度
- 9
- 标签
- 递交数
- 11
- 已通过
- 3
- 上传者