#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int v[N],w[N],p[N],f[N];
int find(int x)
{
if(p[x]!=x) p[x]=find(p[x]);
return p[x];
}
int main()
{
int n,m,W;
cin>>n>>m>>W;
for(int i=1;i<=n;i++) cin>>v[i]>>w[i],p[i]=i;
while(m--)
{
int a,b;
cin>>a>>b;
int pa=find(a),pb=find(b);
if(pa!=pb)
{
p[pa]=pb;
v[pb]+=v[pa];
w[pb]+=w[pa];
}
}
for(int i=1;i<=n;i++)
if(p[i]==i)
{
for(int j=W;j>=v[i];j--)
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
printf("%d\n",f[W]);
return 0;
}
购买搭配(记录集合大小的并查集+01背包)
最新推荐文章于 2024-07-08 22:12:26 发布