社区讨论
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 条回复,欢迎继续交流。
正在加载回复...