社区讨论

80pts求调

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mi8w6uw6
此快照首次捕获于
2025/11/21 21:24
3 个月前
此快照最后确认于
2025/11/21 22:19
3 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e6+1,M=1e4+11;
struct node{ll st,to,wg;}edge[N+N/5+1];
ll n,m,k,U,V,W,fa[M],ans,u[M],v[M],w[M],cnt,costt[11][M];
bool cmp(node x,node y){return x.wg<y.wg;}
ll find(ll x){
	if (fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
void merge(ll x,ll y){fa[find(x)]=find(y);}
int main(){
	cin>>n>>m>>k;
	for (ll i=1;i<=M;i++) fa[i]=i;
	for (ll i=1;i<=m;i++){
		cin>>U>>V>>W;
		edge[i].st=U;
		edge[i].to=V;
		edge[i].wg=W;
	}
	for (ll i=1;i<=k;i++) for (ll j=0;j<=n;j++) cin>>costt[i][j];
	ans=0; 
	sort(edge+1,edge+m+1,cmp);
	for (ll i=1;i<=m;i++){
		ll x=edge[i].st,y=edge[i].to,z=edge[i].wg;
		if (find(x)!=find(y)){
			merge(x,y);
			ans+=z;
			u[++cnt]=x;
			v[cnt]=y;
			w[cnt]=z;
		}
	}
	ll res=ans; 
	for (ll i=1;i<(1<<k);i++){
		ll j=i,l=k,st[20],cost=0,flag=1,count=cnt,cntt=0;
		for (ll a=1;a<=cnt;a++){
			edge[a].st=u[a];
			edge[a].to=v[a];
			edge[a].wg=w[a];
		}
		memset(st,0,sizeof(st));
		for (ll a=1;a<=M;a++) fa[a]=a;
		while (j){
			st[l]=j%2;
			l--;
			j/=2;
		}
		for (ll a=1;a<=k;a++)
		if (st[a]==1){
			cntt++;
			cost+=costt[a][0];
			if (cost>=ans){
				flag=0;
				break;
			}
			for (ll cont=1;cont<=n;cont++){
				edge[++count].st=cntt+n;
				edge[count].to=cont;
				edge[count].wg=costt[a][cont];
			}
		}
		if (flag==0) continue;
		sort(edge+1,edge+count+1,cmp);
		for (ll a=1;a<=count;a++){
			ll x=edge[a].st,y=edge[a].to,z=edge[a].wg;
			if (find(x)!=find(y)){
				merge(x,y);
				cost+=z;
			}
		}
		res=min(cost,res);
	}
	cout<<res;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...