20分代码呈上:
#include <iostream>
#include <cstdio>
using namespace std;
int n,m,r,i,j,x,y,fx,fy,a[10010],b[10010],f[10010];
int find(int t){
if(f[t]==t) return t;
else{
f[t]=find(f[t]);
return f[t];
}
}
int main(){
scanf("%d%d%d",&n,&m,&r);
for(i=1;i<=n;i++) f[i]=i;
for(i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]);
for(j=1;j<=m;j++){
scanf("%d%d",&x,&y);
f[find(x)]=find(y);
}
for(i=1;i<=n;i++)
if(f[i]!=i){
a[f[i]]+=a[i];
b[f[i]]+=b[i];
a[i]=b[i]=0;
}
for(i=1;i<=n;i++)
for(j=r;j>=a[i];j--)
f[j]=max(f[j],f[j-a[i]]+b[i]);
printf("%d\n",f[r]);
return 0;
}
除了第一个点和第九个点都错了。QAQ