社区讨论
16pts求调
P14362[CSP-S 2025] 道路修复参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhiygjfg
- 此快照首次捕获于
- 2025/11/03 17:46 4 个月前
- 此快照最后确认于
- 2025/11/03 17:46 4 个月前
赛时一直在想怎么判断那个乡镇可选,就是没想到暴力,只有48pts
对着正解打的现在只有16pts,前4个点AC其他全WA:
CPP#include <bits/stdc++.h>
#define eps 1e-12
#define inf LONG_LONG_MAX
#define int long long
#define endl '\n'
using namespace std;
const int maxn = 1e6 + 10, mod = 1e9 + 7;
struct node {
int u, v, w;
bool operator < (const node &b) const { return w < b.w; }
} e[maxn], e2[maxn];
int fa[maxn], c[20], a[20][maxn];
void init(int n) { for (int i = 1; i <= n; i++) fa[i] = i; }
int find(int x) { return x == fa[x] ? fa[x] : fa[x] = find(fa[x]); }
signed main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int n, m, k;
cin >> n >> m >> k;
init(n);
for (int i = 1; i <= m; i++) cin >> e[i].u >> e[i].v >> e[i].w;
sort(e + 1, e + m + 1);
int cnt = 0, maxw = -1, ans = 0;
for (int i = 1; i <= m; i++) {
int fx = find(e[i].u), fy = find(e[i].v);
if (fx != fy) {
fa[fx] = fy;
e2[++cnt] = e[i];
ans += (maxw = e[i].w);
}
}
for (int i = 1; i <= k; i++) {
cin >> c[i];
for (int j = 1; j <= n; j++) cin >> a[i][j];
}
for (int i = 1; i < (1 << k); i++) {
int res = 0, num = cnt;
for (int j = 1; j <= k; j++) {
if (i & (1 << (j - 1))) {
res += c[j];
for (int p = 1; p <= n; p++) if (a[j][p] <= maxw) e2[++num] = {j + n, p, a[j][p]};
}
}
sort(e2 + 1, e2 + num + 1);
init(n + k);
for (int j = 1; j <= num; j++) {
int fx = find(e2[j].u), fy = find(e2[j].v);
if (fx != fy) {
fa[fx] = fy;
res += e2[j].w;
}
}
ans = min(ans, res);
}
cout << ans;
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...