70分求助!
  • 板块P1455 搭配购买
  • 楼主ggcggc
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/2/2 13:09
  • 上次更新2023/10/24 02:04:35
查看原帖
70分求助!
712994
ggcggc楼主2023/2/2 13:09
#include<iostream>
#define ri register int 
using namespace std;
int n,m,maxn,f[10010],w[10010],v[10010],dp[10010];
int find(int x){
	return x==f[x]?x:f[x]==find(f[x]);
}
void merge(int x,int y){
	int tx=find(x);
	int ty=find(y);
	if(tx!=ty){
		f[tx]=f[ty];
	}
}
int main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(NULL);
	cin>>n>>m>>maxn;
	for(ri i=1;i<=n;i++){
		f[i]=i;
		cin>>w[i]>>v[i];
	}
	int x,y;
	for(ri i=1;i<=m;i++){
		cin>>x>>y;
		merge(x,y);
	}
	int r;
	for(ri i=1;i<=n;i++){
		if(f[i]!=i){
			r=find(f[i]);
			w[r]=w[r]+w[i];
			v[r]+=v[i];
			w[i]=0;
			v[i]=0;
		}	
	}
	for(ri i=1;i<=n;i++){
		if(w[i]==0&&v[i]==0) continue;
		for(ri j=maxn;j>=w[i];j--){
			dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
		}
	}
	cout<<dp[maxn]<<endl;
	
	return 0;
}
2023/2/2 13:09
加载中...