社区讨论

0pts求调

P14362[CSP-S 2025] 道路修复参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhphydcu
此快照首次捕获于
2025/11/08 07:38
4 个月前
此快照最后确认于
2025/11/08 07:38
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1e4 + 15, maxm = 1e6 + 5;
int fa[maxn], c[15], a[15][maxn], h[maxn];
bool vis[15];
struct Edge{
    int u, v, w, c;
    bool operator < (const Edge& o) const{
        return w > o.w;
    }
};
vector<Edge> G;
void init(int n){
    for(int i = 1; i <= n; i++) fa[i] = i;
}
int find(int x){
    return (fa[x] == x ? x : find(fa[x]));
}
void merge(int x, int y){
    x = find(x); y = find(y);
    if(x == y) return ;
    if(h[y] < h[x]) swap(x, y);
	if(h[x] == h[y]) h[y] = h[x] + 1;
    fa[x] = y;
}
signed main(){
    int n, m, k;
    cin >> n >> m >> k;
    for(int i = 1; i <= m; i++){
        int u, v, w;
        cin >> u >> v >> w;
        G.push_back({u, v, w, 0});
    }
    int ALL = 1145141919810;
    for(int i = 1; i <= k; i++){
        cin >> c[i];
        for(int j = 1; j <= n; j++){
            cin >> a[i][j];
            for(int k = 1; k < j; k++){
                G.push_back({j, k, a[i][j] + a[i][k], i});
            }
        }
        int ans = 0;
        memset(vis, 0, sizeof(vis));
        init(n);
        for(Edge x : G){
            int u = x.u, v = x.v, w = x.w, C = x.c;
            if(find(u) == find(v)) continue;
            merge(u, v);
            if(c && !vis[C]) ans += c[C], vis[C] = true;
            ans += w;
        }
        ALL = min(ALL, ans);
    }
    cout << ALL << endl;
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...