/* -*- coding: utf-8 -*- * * 3201.cc: No.3201 Corporate Synergy - yukicoder */ #include #include #include #include #include #include using namespace std; /* constant */ const int MAX_N = 200; const int MAX_M = 200; const int MAX_K = 200; const int MAX_GN = MAX_N + MAX_K + 2; const long long LINF = 1LL << 60; /* typedef */ using ll = long long; using vi = vector; using pii = pair; using tp3 = tuple; using qi = queue; template struct MaxFlow { using pii = pair; using vpii = vector; using vvpii = vector; using qi = queue; int n, m; vvpii nbrs; T inf, max_flow; vpii prvs; vector minfs, caps, flows; MaxFlow(int _n, T _inf): n(_n), m(0), inf(_inf) { nbrs.assign(n, vpii()); minfs.assign(n, 0); prvs.assign(n, {-1, -1}); caps.clear(), flows.clear(); max_flow = 0; } int addedges(int u, int v, T c) { // edge[m]: u -> v, cap=c nbrs[u].push_back({v, m}); caps.push_back(c); flows.push_back(0); // edge[m + 1]: v -> u, cap=0 nbrs[v].push_back({u, m + 1}); caps.push_back(0); flows.push_back(0); m += 2; return m; } T flow(int st, int gl, bool cont = false) { if (! cont) { fill(flows.begin(), flows.end(), 0); max_flow = 0; } for (;;) { //printf("max_flow = %d, limit = %d\n", max_flow, limit); fill(prvs.begin(), prvs.end(), pii(-1, -1)); prvs[st] = {st, -1}; minfs[st] = inf; qi q; q.push(st); while (! q.empty()) { int u = q.front(); q.pop(); if (u == gl) break; for (auto [v, ei]: nbrs[u]) { T vc = caps[ei] - flows[ei]; if (prvs[v].first < 0 && vc > 0) { prvs[v] = {u, ei}; minfs[v] = (minfs[u] < vc) ? minfs[u] : vc; q.push(v); } } } if (prvs[gl].first < 0) break; T min_flow = minfs[gl]; for (int j = gl; j != st;) { auto [i, ei] = prvs[j]; flows[ei] += min_flow; flows[ei ^ 1] -= min_flow; j = i; } max_flow += min_flow; } return max_flow; } }; /* int main() { const int INF = 1 << 30; MaxFlow mf(3, INF); mf.addedges(0, 1, 1); mf.addedges(1, 2, 3); mf.addedges(0, 2, 1); int f = mf.flow(0, 2); printf("f=%d\n", f); return 0; } */ /* global variables */ int ps[MAX_N]; pii es[MAX_M]; tp3 sgs[MAX_K]; bool used[MAX_GN]; /* subroutines */ /* main */ int main() { int n; scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", ps + i); int m; scanf("%d", &m); for (int i = 0; i < m; i++) { int u, v; scanf("%d%d", &u, &v); u--, v--; es[i] = {u, v}; } int k; scanf("%d", &k); for (int i = 0; i < k; i++) { int u, v, s; scanf("%d%d%d", &u, &v, &s); u--, v--; sgs[i] = {u, v, s}; } int st = n + k, gl = st + 1, gn = gl + 1; MaxFlow mf(gn, LINF); for (int u = 0; u < n; u++) { if (ps[u] > 0) mf.addedges(st, u, ps[u]); else if (ps[u] < 0) { mf.addedges(u, gl, -ps[u]); } } for (int i = 0; i < m; i++) { auto [u, v] = es[i]; mf.addedges(v, u, LINF); } for (int i = 0; i < k; i++) { auto [u, v, s] = sgs[i]; int w = n + i; mf.addedges(st, w, s); mf.addedges(w, u, LINF); mf.addedges(w, v, LINF); } ll f = mf.flow(st, gl); //printf(" f=%lld\n", f); used[st] = true; qi q; q.push(st); while (! q.empty()) { int u = q.front(); q.pop(); if (u == gl) continue; for (auto [v, ei]: mf.nbrs[u]) if (! used[v] && mf.flows[ei] < mf.caps[ei]) used[v] = true, q.push(v); } ll sum = 0; for (int u = 0; u < n; u++) if (used[u]) sum += ps[u]; for (int i = 0; i < k; i++) { auto [u, v, s] = sgs[i]; if (used[u] && used[v]) sum += s; } printf("%lld\n", sum); return 0; }