商店里有n朵云,云朵被编号为i1,2,…,n
,并且每朵云都有一个价值。但一些云朵要搭配来买, 买一朵云则与这朵云有搭配的云都要买。
Joe的钱有限,希望买的价值最大
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
const int N= 1e5+5;
int n,m,V,cost[N],val[N],fa[N];
int f[N];
int find(int x){
if(x==fa[x]) return x;
fa[x]=find(fa[x]);
return fa[x];
}
void uni(int x,int y){
int fx=find(x),fy=find(y);
if(fx==fy) return ;
fa[fx]=fy;
cost[fy]+=cost[fx]; val[fy]+=val[fx];
}
signed main(){
int i,j,x,y;
cin>>n>>m>>V;
for(i=1;i<=n;i++) cin>>cost[i]>>val[i];
for(i=1;i<=n;i++) fa[i]=i;
for(i=1;i<=m;i++) cin>>x>>y,uni(x,y);
for(i=1;i<=n;i++)
if(fa[i]==i){
for(j=V;j>=cost[i];j--)
f[j]=max(f[j],f[j-cost[i]]+val[i]);
}
cout<<f[V];
}
浙公网安备 33010602011771号