社区讨论

24pts玄关求调

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

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@min9xmfd
此快照首次捕获于
2025/12/01 22:58
3 个月前
此快照最后确认于
2025/12/03 22:30
3 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long

const int N=2e5+5,M=1e7+5;
struct node
{
	int u,v,w;
}e[M],g[M];
bool operator < (node x,node y){
	return x.w<y.w;
}
int v[20];
int t;
int fa[N];
int getpa(int x)
{
	if(fa[x]==x)
	{
		return x;
	}
	else
	{
		return fa[x]=getpa(fa[x]);
	}
}

signed main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n,m,k;
	cin>>n>>m>>k;
	for(int i=1;i<=m;i++)
	{
		cin>>e[i].u>>e[i].v>>e[i].w;
	}
	sort(e+1,e+m+1);
	for(int i=1;i<=n;i++)
	{
		fa[i]=i;
	}
	for(int i=1;i<=m;i++)
	{
		if(getpa(e[i].u)==getpa(e[i].v))
		{
			continue;
		}
		t++;
		g[t]=e[i];
		fa[getpa(e[i].u)]=getpa(e[i].v);
	}
	for(int i=1;i<=k;i++)
	{
		cin>>v[i];
		for(int j=1;j<=n;j++)
		{
			int x;
			cin>>x;
			t++;
			g[t]=(node){n+i,j,x};
//			n+i,j,x
		}
	}
	sort(g+1,g+t+1);
	int ans=INT_MAX;
	for(int j=0;j<(1<<k);j++)
	{
		int sum=0;
		for(int i=0;i<k;i++) 
		{
			if(j&(1<<i)) 
			{
				sum+=v[i+1];	
			}
		}
		for(int i=1;i<=n+k;i++)
		{
			fa[i]=i;
		}
		for(int i=1;i<=t;i++){
			if(g[i].u>n && !(j&(1<<(g[i].u-n-1)))) 
			{
				continue;
			}
			if(getpa(g[i].u)==getpa(g[i].v))
			{
				continue;
			}
			sum+=g[i].w;
			fa[getpa(g[i].u)]=getpa(g[i].v);
		}
		ans=min(ans,sum);
	}
	return 0;
}

回复

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

正在加载回复...