题目:
题解:
并查集加01背包
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int p[N],v[N],w[N],f[N];
int find(int x)
{
if(p[x]!=x) p[x]=find(p[x]);
return p[x];
}
int main()
{
int n,q,m;
cin>>n>>q>>m;
for(int i=1;i<=n;i++)
{
cin>>v[i]>>w[i];
}
for(int i=1;i<=n;i++) p[i]=i;
while(q--)
{
int a,b;
cin>>a>>b;
int pa=find(a);
int pb=find(b);
if(pa!=pb)
{
v[pb]+=v[pa];
w[pb]+=w[pa];
p[pa]=pb;
}
}
for(int i=1;i<=n;i++)
{
if(p[i]==i)
for(int j=m;j>=v[i];j--)
{
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
}
cout<<f[m]<<endl;
return 0;
}