社区讨论
神秘!k=0时过不了,玄关
P14362[CSP-S 2025] 道路修复参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mhpi05ow
- 此快照首次捕获于
- 2025/11/08 07:40 4 个月前
- 此快照最后确认于
- 2025/11/08 07:40 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,k;
int vis[20000005];
int c[15];
int a[15][10005];
signed h[20000005];
struct edge{
signed u,v,w;
}e[20000005],es[20000005];
signed fa[20000005];
int find(int x){
if(fa[x]==x){
return x;
}
return fa[x]=find(fa[x]);
}
bool cmp(edge a,edge b){
return a.w<b.w;
}
int minn=LONG_LONG_MAX;
int kruskal(int city,int aa){
// cout<<"ci"<<city<<endl;
int cnt=0;
int ans=0;
for(int i=1;i<=m;i++){
fa[i]=i;
}
for(int i=1;i<=m;i++){
int x=e[i].u;
int y=e[i].v;
if((x>n)&&vis[h[(x-n)*(n+k)+y]]==0) continue;
// cout<<x<<" "<<y<<" "<<cnt<<" "<<ans<<endl;
if(find(x)!=find(y)){
cnt++;
fa[(find(y))]=find(x);
if(aa) vis[i]=1;
ans+=e[i].w;
}
if(cnt==city-1) return ans;
}
}
void dfs(int dep,int ans,int city){
if(ans>minn){
return ;
}
if(dep>k){
int a=kruskal(city,0);
minn=min(minn,a+ans);
// cout<<"ans"<<" "<<ans<<" "<<a<<" "<<ss<<endl;
return ;
}
dfs(dep+1,ans,city);
for(int i=1;i<=m;i++){
if(h[(e[i].u-n)*(n+k)+e[i].v]==dep){
vis[h[(e[i].u-n)*(n+k)+e[i].v]]=1;
}
}
dfs(dep+1,ans+c[dep],city+1);
for(int i=1;i<=m;i++){
if(h[(e[i].u-n)*(n+k)+e[i].v]==dep){
vis[h[(e[i].u-n)*(n+k)+e[i].v]]=0;
}
}
}
signed main(){
cin>>n>>m>>k;
for(int i=1;i<=m;i++){
int a,b,c;
cin>>a>>b>>c;
e[i]={a,b,c};
}
sort(e+1,e+m+1,cmp);
minn=kruskal(n,1);
for(int i=1;i<=m;i++){
es[i]=e[i];
}
int kk=m;
m=0;
for(int i=1;i<=kk;i++){
if(vis[i]){
e[++m]=es[i];
vis[i]=0;
}
}
for(int i=1;i<=k;i++){
cin>>c[i];
for(int j=1;j<=n;j++){
cin>>a[i][j];
e[++m]={n+i,j,a[i][j]};
h[(n+k)*i+j]=i;
}
}
sort(e+1,e+m+1,cmp);
dfs(1,0,n);
cout<<minn<<endl;
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...