社区讨论

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 条回复,欢迎继续交流。

正在加载回复...