经商(并查集+01背包)

    技术2022-07-14  90

    思路:先并查集求出和1号在同一个连通块的的人,然后进行01背包。

    const int N = 1e5 + 5; int a[N], b[N], dp[N]; int fa[N]; int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); } int t; int main() { //freopen("in.txt", "r", stdin); cin >> t; while (t--) { int n, m, c; scanf("%d%d%d", &n, &m, &c); f(i, 1, N)fa[i] = i; f(i, 1, n-1) scanf("%d%d", &a[i+1], &b[i+1]); int x, y; f(i, 1, m) { scanf("%d%d", &x, &y); int f1 = find(x), f2 = find(y); if (f1 < f2)fa[f2] = f1; else fa[f1] = f2; } memset(dp, 0, sizeof dp); f(i, 2, n) { if (find(i) == 1) { for (ll j = c;j >= a[i];--j) { dp[j] = max(dp[j], dp[j - a[i]] + b[i]); } } } cout << dp[c] << endl; } return 0; }
    Processed: 0.010, SQL: 9