搭配购买

洛谷P1455 搭配购买

把需要一起购买的物品放到并查集里,每一个并查集的标志是根节点,把v和w都累加,然后对根节点做01背包。

 

#include<bits/stdc++.h>
using namespace std;

int dad[10001],f[10001],v[10001],bag,w[10001];
int n,m;
int ans;

int getfather(int x)
{
    if(dad[x]==x)  return x;
    dad[x]=getfather(dad[x]);
    return dad[x];
}


int main()
{

    cin>>n>>m>>bag;
    for(int i=1;i<=n;i++) dad[i]=i;
    for(int i=1;i<=n;i++) cin>>w[i]>>v[i];
    int x,y;
    while(m--)
    {
          cin>>x>>y;
          int gx=getfather(x),gy=getfather(y);
          if(gx!=gy)
        {
            dad[gx]=gy;
            v[gy]+=v[gx];    
            w[gy]+=w[gx];
        }    
    }
    
    for(int i=1;i<=n;i++)
    {
        if(getfather(i)==i)
        for(int j=bag;j>=w[i];j--)
        f[j]=max(f[j],f[j-w[i]]+v[i]);
    }
    cout<<f[bag];
    return 0;
}

 

posted @ 2017-08-10 11:56  WeiAR  阅读(171)  评论(0编辑  收藏  举报