社区讨论

72pts求条!!

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mhz4cv4k
此快照首次捕获于
2025/11/15 01:15
4 个月前
此快照最后确认于
2025/11/16 13:52
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
struct E{
    int f,t,w;
};
const int M=1e6+10,N=1e4+10,K = 11;
E o[M],b[N],g[K][N],t[M],c[M];
int p[N],n,m,k;
int cst[K];
int tn;
int bc;
long long mn;
vector<int> s;
int fd(int x){
    if(p[x] != x){
        p[x] = fd(p[x]);
    }
    return p[x];
}
bool cmp(E a, E b){
    return a.w < b.w;
}
void dfs(int i){
    if(i == k + 1){
        int cc = bc;
        for(int j = 1; j <= bc; j++){
            c[j] = b[j];
        }
        long long sum = 0;
        for(int x : s){
            sum += cst[x];
            int a=1,b=1,d=1;
            while(a <= cc && b <= n){
                if(c[a].w < g[x][b].w){
                    t[d++] = c[a++];
                }
                else t[d++] = g[x][b++];
            }
            while(a <= cc){
                t[d++] = c[a++];
            }
            while(b <= n){
                t[d++] = g[x][b++];
            }
            cc = d - 1;
            for(int j = 1; j <= cc; j++){
                c[j] = t[j];
            }
        }
        tn = n + s.size();
        for(int j = 1; j <= tn; j++){
            p[j] = j;
        }
        for(int j = 1; j <= cc; j++){
            int x = fd(c[j].f);
            int y = fd(c[j].t);
            if(x != y){
                p[x] = y;
                sum += c[j].w;
            }
        }
        mn=min(mn,sum);
        return;
    }
    dfs(i + 1);
    if(i <= k){
        s.push_back(i);
        dfs(i + 1);
        s.pop_back();
    }
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m >> k;
    for(int i = 1; i <= m; i++){
        cin>>o[i].f>>o[i].t>>o[i].w;
    }
    for(int i = 1; i <= n; i++){
        //初始化
        p[i]=i;
    }
    sort(o+1,o+m+1,cmp);
    bc=0;
    mn=0;
    for(int i = 1; i <= m; i++){
        int x = fd(o[i].f);
        int y = fd(o[i].t);
        if(x != y){
            p[x] = y;
            b[++bc] = o[i];
            mn += o[i].w;
        }
    }
    for(int i = 1; i <= k; i++){
        cin >> cst[i];
        for(int j = 1; j <= n; j++){
            g[i][j].f = n + i;
            g[i][j].t = j;
            cin >> g[i][j].w;
        }
        sort(g[i] + 1, g[i] + n + 1,cmp);
    }
    dfs(1);
    cout << mn;
    return 0;
}

回复

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

正在加载回复...