并查集 + 01背包80分,求助!!!
  • 板块P1455 搭配购买
  • 楼主CKAO
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/7/13 18:58
  • 上次更新2023/11/3 10:03:13
查看原帖
并查集 + 01背包80分,求助!!!
583126
CKAO楼主2023/7/13 18:58
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cstdio>
#include<map>
#include<cmath>
#include<vector>
#include<set>
#include<queue>
using namespace std;
#define more ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
const int N = 1e4 + 5, INF = 0x3f3f3f3f, MOD = 1e9 + 7;
typedef long long LL;
typedef pair<int, int> PII;
int f[N], w[N], v[N], p[N];

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

void solve() 
{
    int n, m, cost; cin>>n>>m>>cost;

    for (int i = 1; i <= n; i++) p[i] = i;

    for (int i = 1; i <= n; i++) cin >> w[i] >> v[i];

    while (m--)
    {
        int a, b; cin >> a >> b;
        int x = find(a), y = find(b);
        if (x != y)
        {
            p[x] = y;
            w[y] += w[x];
            v[y] += v[x];
        }
    }
    vector<int> V, W;
    for (int i = 1; i <= n; i++)
        if (p[i] == i)
        {
            W.push_back(w[i]);
            V.push_back(v[i]);
        }

    n = W.size();
    for (int i = 1; i <= n; i++)
        for (int j = cost; j >= W[i]; j--)
            f[j] = max(f[j], f[j - W[i]] + V[i]);
    cout << f[cost] << endl;

}

int main()
{
    more;
    // int T;
    // cin >> T;
    // while (T--)
    // {
    //     solve();
    // }
    solve();
    return 0;
}

2023/7/13 18:58
加载中...