第#2 #3 #4 个点没过去
#include<bits/stdc++.h>
using namespace std;
int fa[10005];
int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
int main()
{
int n,m,w,c[10005],d[10005],dp[100005];
scanf("%d%d%d",&n,&m,&w);
for(int i = 1;i<=n;i++)
scanf("%d%d",&c[i],&d[i]);
for(int i = 1;i<=n;i++) fa[i]=i;
for(int i = 1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
int fu=find(u);
int fv=find(v);
fa[u]=v;
}
for(int i = 1;i<=n;i++)
{
if(fa[i]!=i)
{
int f=find(i);
d[f]+=d[i]; d[i]=0;
c[f]+=c[i]; c[i]=0;
}
}
for(int i = 1;i <= n;i++)
for(int j= w;j>=c[i];j--)
{
dp[j]=max(dp[j],dp[j-c[i]]+d[i]);
}
printf("%d",dp[w]);
}