1. 程式人生 > >搭配購買

搭配購買

using bit clu ans span spa cin ace out

洛谷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; }

搭配購買