题目
解析
#include <iostream>
#include <cstdlib>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
#include <functional>
#include <unordered_set>
#include <set>
#include <bitset>
#include <cstdio>
using namespace std;
// 并查集+01背包问题
const int N = 1e5 + 100;
int n, m, w;
int c[N], d[N], p[N], f[N];
inline void init() {
for (int i = 1; i <= n; i++) p[i] = i;
}
int find(int x) {
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
inline void merge(int x, int y) {
int fa = find(x), fb = find(y);
if (fa != fb) {
p[fa] = fb;
c[fb] += c[fa];
d[fb] += d[fa];
}
}
int main() {
cin >> n >> m >> w;
for (int i = 1; i <= n; i++) {
cin >> c[i] >> d[i];
}
init();
for (int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
merge(u, v);
merge(v, u);
}
for (int i = 1; i <= n; i++) {
if (p[i] == i) // 表示是根节点
for (int j = w; j >= c[i]; j--) {
f[j] = max(f[j], f[j - c[i]] + d[i]);
}
}
cout << f[w] << endl;
return 0;
}