cf-741B - Arpa's weak amphitheater and Mehrdad's valuable Hoses
#include<bits/stdc++.h>
using namespace std;
#define MAXN 10050
#define ll long long
int n,p,m;
int w[MAXN],v[MAXN];
int dp[MAXN*100];
int hx[MAXN];
vector<pair<int,int> > vec[MAXN];
int f[MAXN];
int getf(int n){
if(n==f[n])return n;
f[n]=getf(f[n]);
return f[n];//并查集压缩路径
}
void merge(int a,int b){
int fa,fb;
fa=getf(a);
fb=getf(b);
if(fa!=fb){
f[fb]=fa;
}
}
void init(){
memset(dp,0,sizeof(dp));
memset(hx,0,sizeof(hx));
for(int i=1;i<=n;i++){
f[i]=i;
vec[i].clear();
}
}
int main(){
while(cin>>n>>p>>m){
init();
for(int i=1;i<=n;i++){
scanf("%d",&w[i]);
}
for(int i=1;i<=n;i++){
scanf("%d",&v[i]);
}
for(int i=1;i<=p;i++){
int a,b;
scanf("%d%d",&a,&b);
merge(a,b);
}
int cnt=0;
for(int i=1;i<=n;i++){
int fn=getf(i);
if(hx[fn]==0)hx[fn]=++cnt;//hx表映射 构建分组背包
vec[hx[fn]].push_back(pair<int,int>(w[i],v[i]));
}
for(int i=1;i<=cnt;i++){
if(vec[i].size()==1)continue;
int sumw,sumv;
sumw=sumv=0;
for(int j=0;j<vec[i].size();j++){
sumw+=vec[i][j].first;
sumv+=vec[i][j].second;
}
vec[i].push_back(pair<int,int>(sumw,sumv));//本组物品合集当做一个物品
}
int mx=0;
for(int i=1;i<=n;i++){
for(int j=m;j>=1;j--){
for(int k=0;k<vec[i].size();k++){
if(j<vec[i][k].first)continue;
dp[j]=max(dp[j],dp[j-vec[i][k].first]+vec[i][k].second);
mx=max(mx,dp[j]);
}
}
}
cout<<mx<<endl;
}
return 0;
}