1 条题解
-
0kjkj LV 6 @ 2017-10-20 21:07:33
#include<iostream>
using namespace std;
int fa[10020];
int w[10020],f[10020];
int v[10020];
int find(int x)
{
if(x!=fa[x]) fa[x]=find(fa[x]);
return fa[x];
}
int unionn(int x,int y)
{
int a=find(x);
int b=find(y);
fa[a]=b;
}
int n,m,val;int main()
{
//freopen("xu.txt","r",stdin);
cin>>n>>m>>val;for(int i=1;i<=n;i++)
{
cin>>w[i]>>v[i];
fa[i]=i;
}for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
fa[fy]=fa[fx];w[fx]+=w[fy];v[fx]+=v[fy];
}}
int tot=0;
for(int i=1;i<=n;i++)
{
if(fa[i]==i)
{
w[++tot]=w[i];
v[tot]=v[i];
}
}
for(int i=1;i<=tot;i++)
for(int j=val;j>=w[i];j--)
{
f[j]=max(f[j],f[j-w[i]]+v[i]);
//cout<<f[j]<<endl;
}cout<<f[val];
}
- 1