代码如下,调试和对照题解都没有问题,但不知道为什么WA了一个点
//并查集+01背包
#include<bits/stdc++.h>
using namespace std;
int n,m,w,c[10001],v[10001],a,b,f[10001],dp[10001];
int find(int a){
if(f[a]==a)return a;
return f[a]=find(f[a]);
}
int main(){
cin>>n>>m>>w;
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=n;i++){
cin>>c[i]>>v[i];
}
for(int i=1;i<=m;i++){
cin>>a>>b;
f[find(a)]=find(b);
}
//for(int i=1;i<=n;i++)cout<<c[i]<<" "<<v[i]<<" ";
for(int i=1;i<=n;i++)
{
if(f[i]!=i)
{
c[find(i)]+=c[i];
c[i]=0;
v[find(i)]+=v[i];
v[i]=0;
}
}
//for(int i=1;i<=n;i++)cout<<c[i]<<" "<<v[i]<<" ";
for(int i=1;i<=n;i++){
for(int j=w;j>=1;j--){
if(c[find(i)]<=j)
dp[j]=max(dp[j],dp[j-c[find(i)]]+v[find(i)]);
else
dp[j]=dp[j];
}
}
cout<<dp[w];
return 0;
}