購入して1252をAcWing(互いに素セット、01バックパック)

トピックリンク:こちらをクリックしてください

ここに画像を挿入説明
ここに画像を挿入説明

バインドボリュームとルートに対する各項目の値は、全て01ナップザック問題のルートとして見ることができます

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
const int N = 10010;

int n, m, vol;
int f[N];
int v[N], w[N];
int dp[N];

int find(int x)
{
    if(f[x] != x)   f[x] = find(f[x]);
    return f[x];
}

int main()
{
    scanf("%d%d%d", &n, &m, &vol);
    
    for(int i = 1; i <= n; ++i) f[i] = i;
    
    for(int i = 1; i <= n; ++i) scanf("%d%d", &v[i], &w[i]);
    
    for(int i = 1; i <= m; ++i)
    {
        int a, b;
        scanf("%d%d", &a, &b);
        int fa = find(a), fb = find(b);
        if(fa != fb)
        {
            v[fb] += v[fa];
            w[fb] += w[fa];
            f[fa] = fb;
        }
    }
    
    for(int i = 1; i <= n; ++i)
    {
        if(f[i] == i)
        {
            for(int j = vol; j >= v[i]; j--)
            {
                dp[j] = max(dp[j], dp[j-v[i]] + w[i]);
                
            }
        }
    }
    
    printf("%d\n", dp[vol]);
    
    return 0;
}
844元記事公開 ウォンの賞賛135 ビュー150,000 +を

おすすめ

転載: blog.csdn.net/qq_42815188/article/details/105147371