社区讨论

样例过不了,看不出哪里有问题

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 条回复,欢迎继续交流。

正在加载回复...