1 条题解
-
0
并查集 + 01背包
#include <bits/stdc++.h> #define int long long int using namespace std; const int N = 2e5 + 7; int n,m,w; int fa[N << 1],val[N],weight[N]; int bagv[N],bagw[N],f[N]; vector<int> e[N]; inline int read(){ int x = 0,f = 1; char c = getchar(); for(;!isdigit(c);c = getchar()) if(c == '-')f = -1; for(;isdigit(c);c = getchar()) x = (x << 1) + (x << 3) + c - '0'; return x * f; } int get(int x){ if(fa[x] == x)return x; return fa[x] = get(fa[x]); } void merge(int x,int y){ x = get(x); y = get(y); if(x != y){ fa[x] = y; val[y] += val[x]; weight[y] += weight[x]; } } signed main(){ n = read(),m = read(),w = read(); for(int i = 1;i <= n;i ++){ fa[i] = i; weight[i] = read(); val[i] = read(); } for(int i = 1;i <= m;i ++){ int x = read(),y = read(); merge(x,y); } int cnt = 0; for(int i = 1;i <= n;i ++){ if(fa[i] == i){ bagw[++ cnt] = weight[i]; bagv[cnt] = val[i]; } } for(int i = 1;i <= cnt;i ++){ for(int k = w;k >= bagw[i];k --){ f[k] = max(f[k],f[k - bagw[i]] + bagv[i]); } } printf("%lld",f[w]); return 0; }
信息
- ID
- 397
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 8
- 已通过
- 3
- 上传者