#include <bits/stdc++.h>
using namespace std;
const int N=100010;
int p[N],n,m,w,jq[N],jz[N],dp[N];
int find(int x){
if(p[x]!=x){
int root=find(p[x]);
p[x]=root;
}
return p[x];
}
int main(){
for(int i=1;i<=N;i++){
p[i]=i;
}
cin>>n>>m>>w;
for(int i=1;i<=n;i++){
cin>>jq[i]>>jz[i];
}
while(m--){
int a,b;
cin>>a>>b;
int pa=find(a),pb=find(b);
if(pa!=pb){
p[pa]=p[pb];
jq[b]+=jq[a];
jz[b]+=jz[a];
}
}
for(int i=1;i<=n;i++){
if(p[i]==i){
for(int j=w;j>=jq[i];j--){
dp[j]=max(dp[j],dp[j-jq[i]]+jz[i]);
}
}
}
cout<<dp[w];
return 0;
}
真的很好懂(并查集加上动态规划)
帮助我的神牜下面长10厘米(●ˇ∀ˇ●)