社区讨论

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

正在加载回复...