#include<bits/stdc++.h>
using namespace std;
int n,m,w,f[20005],uu[20005],vv[20005],cnt,dp[20005];
struct buy{
int c,d;
}a[20005];
int ys(int u){
if(u==f[u]){
return u;
}else{
return f[u]=ys(f[u]);
}
}
int main(){
scanf("%d%d%d",&n,&m,&w);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i].c,&a[i].d);
f[i]=i;
}
for(int i=1,u,v;i<=m;i++){
scanf("%d%d",&u,&v);
a[ys(u)].c+=a[ys(v)].c;
a[ys(u)].d+=a[ys(v)].d;
f[ys(v)]=ys(u);
}
for(int i=1;i<=n;i++){
if(f[i]==i){
uu[++cnt]=a[i].c;
vv[cnt]=a[i].d;
}
}
for(int i=1;i<=cnt;i++){
for(int j=w;j>=uu[i];j--){
dp[j]=max(dp[j],dp[j-uu[i]]+vv[i]);
}
}
printf("%d",dp[w]);
return 0;
}
这份代码是错误的,因为在23行没特判
4 3 10
3 10
3 10
3 10
10 1
1 3
3 2
1 2
//数据来源acwing
答案:
30
我去年就被误导了