#include <cstdio> #include <cstdlib> #include <string> #include <vector> #include <algorithm> #include <set> using namespace std; struct pouring { int from, to; }; struct reaction { int a, b; }; int g[200000 + 2]; vector<pouring> pourings; vector<reaction> reactions; set<int> flasks[200000 + 2]; int aliases[200000 + 2]; int main() { int n, m, k; scanf("%d%d%d", &n, &m, &k); for (int i = 1; i <= n; i++) { scanf("%d", &g[i]); } for (int i = 0; i < m; i++) { pouring p; scanf("%d%d", &p.from, &p.to); pourings.push_back(p); } for (int i = 0; i < k; i++) { reaction r; scanf("%d%d", &r.a, &r.b); flasks[r.a].insert(reactions.size()); flasks[r.b].insert(reactions.size()); reactions.push_back(r); } // Follow the pouring process as described on input. long long wyn = 0; for (int i = 0; i < pourings.size(); i++) { int from = pourings[i].from; int to = pourings[i].to; bool swapped = false; if (aliases[from]) { from = aliases[from]; } if (aliases[to]) { to = aliases[to]; } if (flasks[from].size() > flasks[to].size()) { swap(from, to); swapped = true; } for (set<int>::iterator it = flasks[from].begin(); it != flasks[from].end(); it++) { if (flasks[to].find(*it) != flasks[to].end()) { int mm = min(g[reactions[*it].a], g[reactions[*it].b]); g[reactions[*it].a] -= mm; g[reactions[*it].b] -= mm; wyn += 2 * mm; flasks[to].erase(*it); } else { flasks[to].insert(*it); } } if (swapped) { aliases[pourings[i].to] = to; } } printf("%lld\n", wyn); return 0; }
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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | #include <cstdio> #include <cstdlib> #include <string> #include <vector> #include <algorithm> #include <set> using namespace std; struct pouring { int from, to; }; struct reaction { int a, b; }; int g[200000 + 2]; vector<pouring> pourings; vector<reaction> reactions; set<int> flasks[200000 + 2]; int aliases[200000 + 2]; int main() { int n, m, k; scanf("%d%d%d", &n, &m, &k); for (int i = 1; i <= n; i++) { scanf("%d", &g[i]); } for (int i = 0; i < m; i++) { pouring p; scanf("%d%d", &p.from, &p.to); pourings.push_back(p); } for (int i = 0; i < k; i++) { reaction r; scanf("%d%d", &r.a, &r.b); flasks[r.a].insert(reactions.size()); flasks[r.b].insert(reactions.size()); reactions.push_back(r); } // Follow the pouring process as described on input. long long wyn = 0; for (int i = 0; i < pourings.size(); i++) { int from = pourings[i].from; int to = pourings[i].to; bool swapped = false; if (aliases[from]) { from = aliases[from]; } if (aliases[to]) { to = aliases[to]; } if (flasks[from].size() > flasks[to].size()) { swap(from, to); swapped = true; } for (set<int>::iterator it = flasks[from].begin(); it != flasks[from].end(); it++) { if (flasks[to].find(*it) != flasks[to].end()) { int mm = min(g[reactions[*it].a], g[reactions[*it].b]); g[reactions[*it].a] -= mm; g[reactions[*it].b] -= mm; wyn += 2 * mm; flasks[to].erase(*it); } else { flasks[to].insert(*it); } } if (swapped) { aliases[pourings[i].to] = to; } } printf("%lld\n", wyn); return 0; } |