- 【CSP-S 2025】道路修复
97……求调!!
- @ 2025-11-14 12:02:31
#include<bits/stdc++.h>
using namespace std;
using LL = long long;
#define fi first
#define se second
const int N=20005,M=2000005;
int n,m,k,fa[N],cost[15],vis[15];
pair<int,pair<int,int> > e[M];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;++i)scanf("%d%d%d",&e[i].se.fi,&e[i].se.se,&e[i].fi);
sort(e+1,e+m+1);
for(int i=1;i<=n;++i)fa[i]=i;
int ecnt=0;
for(int i=1;i<=m;++i){
int fu=find(e[i].se.fi),fv=find(e[i].se.se);
if(fu!=fv){
fa[fv]=fu,e[++ecnt]=e[i];
if(ecnt==n-1)break;
}
}
for(int i=1;i<=k;++i){
scanf("%d",&cost[i]);
for(int j=1,x;j<=n;++j)scanf("%d",&x),e[++ecnt]={x,{j,n+i}};
}
sort(e+1,e+ecnt+1);
LL ans=1e18;
for(int stat=0;stat<(1<<k);++stat){
LL now=0;
int num=0;
for(int i=1;i<=k;++i){if((stat>>(i-1))&1)++num,vis[i]=1,now+=cost[i];else vis[i]=0;}
for(int i=1;i<=n+k;++i)fa[i]=i;
int ec=n+num-1;
for(int i=1;i<=ecnt;++i){
int u=e[i].se.fi,v=e[i].se.se;
if(v>n && !vis[v-n])continue;
int fu=find(u),fv=find(v);
if(fu!=fv){
fa[fv]=fu,now+=e[i].fi;
if(!(--ec))break;
}
}
if(!ec)ans=min(ans,now);
}
printf("%lld",ans);
}
洛谷能A。。。
1 comments
-
Nostopathy LV 9 @ 2025-11-14 12:02:41
@Hydro
- 1
Information
- ID
- 40114
- Time
- ms
- Memory
- MiB
- Difficulty
- 10
- Tags
- (None)
- # Submissions
- 15
- Accepted
- 0
- Uploaded By