#include <cstdio> #include <vector> #include <algorithm> #define LL long long int using namespace std; struct S { int waga, fiolka; }; struct P { int f, s; }; struct F { vector<int> sub; LL osad; }; int main() { int n, m, k; scanf("%d%d%d", &n, &m, &k); vector<S> substancje(n+1); vector<F> fiolki(n+1); vector<P> reakcje(k), eksperyment(m); for(int i = 1; i <= n; ++i) { scanf("%d", &substancje[i].waga); substancje[i].fiolka = i; fiolki[i].sub.push_back(i); } for(int i = 0; i < m; ++i) { scanf("%d%d", &eksperyment[i].f, &eksperyment[i].s); } for(int i = 0; i < k; ++i) { scanf("%d%d", &reakcje[i].f, &reakcje[i].s); } for(int i = 0; i < m; ++i) { int from = eksperyment[i].f, to = eksperyment[i].s; for(int j = 0; j < fiolki[from].sub.size(); ++j) { int csub = fiolki[from].sub[j]; for(int ii = 0; ii < k; ++ii) { if(reakcje[ii].f == csub && substancje[reakcje[ii].s].fiolka == to) { fiolki[to].osad += 2* min(substancje[csub].waga, substancje[reakcje[ii].s].waga); int o = min(substancje[csub].waga, substancje[reakcje[ii].s].waga); substancje[csub].waga -= o; substancje[reakcje[ii].s].waga -= o; } else if(reakcje[ii].s == csub && substancje[reakcje[ii].f].fiolka == to) { fiolki[to].osad += 2* min(substancje[csub].waga, substancje[reakcje[ii].f].waga); int o=min(substancje[csub].waga, substancje[reakcje[ii].f].waga); substancje[csub].waga -= o; substancje[reakcje[ii].f].waga -= o; } } } vector<int> nowy; for(int j = 0; j < fiolki[to].sub.size(); ++j) { if(substancje[fiolki[to].sub[j]].waga > 0) nowy.push_back(fiolki[to].sub[j]); } fiolki[to].sub = nowy; for(int j = 0; j < fiolki[from].sub.size(); ++j) { if(substancje[fiolki[from].sub[j]].waga > 0) { substancje[fiolki[from].sub[j]].fiolka = to; fiolki[to].sub.push_back(fiolki[from].sub[j]); } } } LL totalOsad = 0; for(int i = 1; i <= n; ++i) { totalOsad += fiolki[i].osad; } printf("%lld\n", totalOsad); 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 84 85 86 87 88 89 90 91 | #include <cstdio> #include <vector> #include <algorithm> #define LL long long int using namespace std; struct S { int waga, fiolka; }; struct P { int f, s; }; struct F { vector<int> sub; LL osad; }; int main() { int n, m, k; scanf("%d%d%d", &n, &m, &k); vector<S> substancje(n+1); vector<F> fiolki(n+1); vector<P> reakcje(k), eksperyment(m); for(int i = 1; i <= n; ++i) { scanf("%d", &substancje[i].waga); substancje[i].fiolka = i; fiolki[i].sub.push_back(i); } for(int i = 0; i < m; ++i) { scanf("%d%d", &eksperyment[i].f, &eksperyment[i].s); } for(int i = 0; i < k; ++i) { scanf("%d%d", &reakcje[i].f, &reakcje[i].s); } for(int i = 0; i < m; ++i) { int from = eksperyment[i].f, to = eksperyment[i].s; for(int j = 0; j < fiolki[from].sub.size(); ++j) { int csub = fiolki[from].sub[j]; for(int ii = 0; ii < k; ++ii) { if(reakcje[ii].f == csub && substancje[reakcje[ii].s].fiolka == to) { fiolki[to].osad += 2* min(substancje[csub].waga, substancje[reakcje[ii].s].waga); int o = min(substancje[csub].waga, substancje[reakcje[ii].s].waga); substancje[csub].waga -= o; substancje[reakcje[ii].s].waga -= o; } else if(reakcje[ii].s == csub && substancje[reakcje[ii].f].fiolka == to) { fiolki[to].osad += 2* min(substancje[csub].waga, substancje[reakcje[ii].f].waga); int o=min(substancje[csub].waga, substancje[reakcje[ii].f].waga); substancje[csub].waga -= o; substancje[reakcje[ii].f].waga -= o; } } } vector<int> nowy; for(int j = 0; j < fiolki[to].sub.size(); ++j) { if(substancje[fiolki[to].sub[j]].waga > 0) nowy.push_back(fiolki[to].sub[j]); } fiolki[to].sub = nowy; for(int j = 0; j < fiolki[from].sub.size(); ++j) { if(substancje[fiolki[from].sub[j]].waga > 0) { substancje[fiolki[from].sub[j]].fiolka = to; fiolki[to].sub.push_back(fiolki[from].sub[j]); } } } LL totalOsad = 0; for(int i = 1; i <= n; ++i) { totalOsad += fiolki[i].osad; } printf("%lld\n", totalOsad); return 0; } |