-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patharc098d.cpp
More file actions
48 lines (48 loc) · 1.12 KB
/
Copy patharc098d.cpp
File metadata and controls
48 lines (48 loc) · 1.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <bits/stdc++.h>
#define pb push_back
#define rep(i, j, k) for(int i = j; i <= k; ++ i)
#define per(i, j, k) for(int i = j; i >= k; -- i)
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int n, m, a[N], b[N], p[N], f[N];
vector<int> G[N], T[N];
ll dp[N], s[N];
int find(int u) {
return u == f[u] ? u : f[u] = find(f[u]);
}
void dfs(int u) {
s[u] = b[u];
dp[u] = T[u].size() ? (1ll << 61) : max(0, a[u] - b[u]);
for(int v : T[u]) {
dfs(v);
s[u] += s[v];
dp[u] = min(dp[u], dp[v] + max(0ll, a[u] - b[u] - s[v] - dp[v]));
}
}
int main() {
scanf("%d%d", &n, &m);
ll sum = 0;
rep(i, 1, n) scanf("%d%d", a + i, b + i);
int u, v;
rep(i, 1, m) {
scanf("%d%d", &u, &v);
G[u].pb(v); G[v].pb(u);
}
rep(i, 1, n) p[i] = i;
sort(p + 1, p + n + 1, [&](int x, int y) { return a[x] - b[x] <= a[y] - b[y]; });
rep(i, 1, n) {
int u = p[i]; f[u] = u;
for(int v : G[u]) if(f[v]) {
v = find(v);
if(f[v] != u) {
T[u].pb(v); f[v] = u;
}
}
}
int rt = 0;
rep(i, 1, n) if(find(i) == i) rt = i;
dfs(rt);
printf("%lld\n", s[rt] + dp[rt]);
return 0;
}