社区讨论
样例过不了,看不出哪里有问题
P14362[CSP-S 2025] 道路修复参与者 2已保存回复 13
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 13 条
- 当前快照
- 1 份
- 快照标识符
- @mhz4gwcz
- 此快照首次捕获于
- 2025/11/15 01:18 3 个月前
- 此快照最后确认于
- 2025/11/16 14:21 3 个月前
CPP
#include<bits/stdc++.h>
#define N 10015
#define M 1100005
#define K 15
//#define int long long
using namespace std;
int n,m,k,c[K],a[K][N],fa[N],ans=1e9;
bool f[K];
struct edge{
int u,v,w;
}e[M];
vector<edge> ed;
bool cmp(edge a,edge b){
return a.w<b.w;
}
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void start(){
for(int i=1;i<=n+k;i++){
fa[i]=i;
}
}
void kruskal(int num,int flag,int mon){
start();
int res=mon,cnt=0;
for(int i=1;i<=m;i++){
int u=e[i].u,v=e[i].v;
if(u>n&&!f[u-n]) continue;
int fu=find(u),fv=find(v);
if(fu==fv) continue;
fa[fu]=fv;
res+=e[i].w;
cnt++;
if(flag) ed.push_back(edge{u,v});
if(cnt==num-1) break;
}
// cout<<res<<endl;
ans=min(ans,res);
}
signed main()
{
// freopen("road.in","r",stdin);
// freopen("road.out","w",stdout);
cin>>n>>m>>k;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
}
sort(e+1,e+m+1,cmp);
kruskal(n,1,0);
m=0;
for(edge num:ed){
e[++m]=num;
}
for(int i=1;i<=k;i++){
scanf("%d",&c[i]);
for(int j=1;j<=n;j++){
scanf("%d",&a[i][j]);
e[++m]=edge{n+i,j,a[i][j]};
}
}
sort(e+1,e+m+1,cmp);
for(int u=1;u<(1<<k);u++){
int num=n,tmp=0;
for(int i=1;i<=k;i++){
f[i]=((1<<(i-1))&u);
num+=f[i];
if(f[i]) tmp+=c[i];
}
kruskal(num,0,tmp);
}
printf("%d",ans);
return 0;
}
回复
共 13 条回复,欢迎继续交流。
正在加载回复...