社区讨论

求复杂度

P14362[CSP-S 2025] 道路修复参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhpi2422
此快照首次捕获于
2025/11/08 07:41
3 个月前
此快照最后确认于
2025/11/08 07:41
3 个月前
查看原帖
民间数据 挂成 88pts
个人感觉是 O(2kmlogn)O(2^k m \log n) 的,虽然跑不满,但官方数据有点太水了吧
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 条回复,欢迎继续交流。

正在加载回复...