1252. 搭配购买并查集 + 01背包

Posted 幽殇默

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1252. 搭配购买并查集 + 01背包相关的知识,希望对你有一定的参考价值。


https://www.acwing.com/problem/content/1254/
先处理并查集,将每一个连通块当成一个物品,这就转化成了01背包问题。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,w;
int p[N],price[N],s[N];//并查集
int V[N],W[N],f[N];//01背包
int find(int x)
{
    if(x!=p[x]) p[x]=find(p[x]);
    return p[x];
}
unordered_map<int,int>mp;
int main(void)
{
    cin>>n>>m>>w;
    for(int i=1;i<=n;i++) p[i]=i;
    for(int i=1;i<=n;i++) cin>>price[i]>>s[i];
    for(int i=1;i<=m;i++)
    {
        int a,b; cin>>a>>b;
        if(find(a)!=find(b))
        {
            s[find(b)]+=s[find(a)];
            price[find(b)]+=price[find(a)];
            p[find(a)]=find(b);
        }
    }
    int cnt=1;
    for(int i=1;i<=n;i++) if(!mp[find(i)]) V[cnt]=price[find(i)],W[cnt++]=s[find(i)],mp[find(i)]++;
    for(int i=1;i<cnt;i++)
        for(int j=w;j>=V[i];j--)
            f[j]=max(f[j],f[j-V[i]]+W[i]);
    cout<<f[w];
    return 0;
}

以上是关于1252. 搭配购买并查集 + 01背包的主要内容,如果未能解决你的问题,请参考以下文章

P1455 搭配购买

第四章 高级数据结构

搭配购买

动规(21)-并查集基础题——搭配购买

动规(21)-并查集基础题——搭配购买

动规(21)-并查集基础题——搭配购买