P1455 搭配购买 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,w;
int c[N],d[N];
int u[N],v[N];
int dp[N];
int fa[N];
int find(int x)
{
if(fa[x]!=x)
return fa[x]=find(fa[x]);
else
return x;
}
void Union(int x,int y)
{
int rx,ry;
rx=find(x);
ry=find(y);
if(rx!=ry)
fa[rx]=ry;
}
int main()
{
cin>>n>>m>>w;
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=n;i++)
cin>>c[i]>>d[i];
for(int i=1;i<=m;i++)
{
cin>>u[i]>>v[i];
Union(u[i],v[i]);
}
for(int i=1;i<=n;i++)//把搭配的云的价值与价格和到一朵云中,其他的置为0
{
if(fa[i]!=i)
{
c[find(i)]+=c[i];
c[i]=0;
d[find(i)]+=d[i];
d[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]);
}
}
cout<<dp[w];
return 0;
}