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;
}