社区讨论
求复杂度
P14362[CSP-S 2025] 道路修复参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhpi2422
- 此快照首次捕获于
- 2025/11/08 07:41 3 个月前
- 此快照最后确认于
- 2025/11/08 07:41 3 个月前
官方数据 100pts
民间数据 挂成 88pts
个人感觉是 的,虽然跑不满,但官方数据有点太水了吧
CPP#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5,K=12;
const int M=1e6+N*K;
struct edge {
int u,v,w;
} a[M];
long long ans,res;
int n,k,m,cnt;
int f[N+K],c[K];
bool fl[K];
bool cmp(edge x,edge y) {
return x.w<y.w;
}
int fd(int x) {
if(x==f[x]) return x;
else return f[x]=fd(f[x]);
}
int read() {
int x=0;
char c;
while(c>'9'||c<'0') c=getchar();
while(c<='9'&&c>='0') {
x=x*10+(c-'0');
c=getchar();
}
return x;
}
int main() {
cin>>n>>m>>k;
for(int i=1;i<=m;i++) a[i].u=read(),a[i].v=read(),a[i].w=read();
cnt=m;
for(int i=1;i<=k;i++) {
c[i]=read();
for(int j=1;j<=n;j++) a[++cnt]={n+i,j,read()};
}
ans=1e17;
sort(a+1,a+cnt+1,cmp);
for(int i=0;i<=(1<<k)-1;i++) {
res=0;
int nwd=n;
for(int j=0;j<k;j++) {
if(i&(1<<j)) res+=c[j+1],fl[j+1]=1,nwd++;
else fl[j+1]=0;
}
if(res>=ans) continue;
for(int j=1;j<=n+k;j++) f[j]=j;
for(int j=1;j<=cnt;j++) {
int fr=a[j].u,to=a[j].v;
if((fr>n&&!fl[fr-n])||fd(fr)==fd(to)) continue;
f[fd(fr)]=to;
nwd--;
res+=a[j].w;
if(nwd==1||res>=ans) break;
}
ans=min(ans,res);
}
cout<<ans;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...