社区讨论

MnZn求助,并查集+背包

P1455搭配购买参与者 2已保存回复 5

讨论操作

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

当前回复
5 条
当前快照
1 份
快照标识符
@lobcfoj4
此快照首次捕获于
2023/10/29 18:43
2 年前
此快照最后确认于
2023/11/04 00:29
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=10005;
int fa[maxn];
struct node{
	int v,w;
}a[maxn];
int dp[maxn];
int find(int x){
	if(fa[x]==x)return x;
	else
	return fa[x]=find(fa[x]);
}
int main(){
	int n,m,w;
	cin>>n>>m>>w;
	for(int i=1;i<=n;i++){
		cin>>a[i].v>>a[i].w;
		fa[i]=i;
	}
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		int fx=find(x);
		int fy=find(y);
		if(fx==fy)continue;
		else
		{
			fa[fy]=fx;
			a[fx].v+=a[y].v;
			a[fx].w+=a[y].w;
			a[x].v=0;
			a[x].w=0;
			a[y].v=0;
			a[y].w=0;
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=w;j>=a[i].v;j--){
			dp[j]=max(dp[j],dp[j-a[i].v]+a[i].w);
		}
	}
	int ans=-1;
	for(int i=1;i<=w;i++)
		ans=max(ans,dp[i]);
	cout<<ans<<endl;
	return 0;
}

回复

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

正在加载回复...