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
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;

int main() {
	
	int n,m,k;
	long long int result = 0;
	
	scanf("%d%d%d",&n,&m,&k);
	
	int g[n+1], s[n+1]; //s - w jakiej fiolce znajduje sie i-ta substancja
	vector<int> fiolka[n+1]; // dla kazdej fiolki lista substancji w niej sie znajdujacych
	
	for (int i=1; i<=n; i++)
	{
		scanf("%d",&g[i]);
		s[i] = i;
	}
	
	int from[m], to[m];
	for (int i=0; i<m; i++)
		scanf("%d%d",&from[i],&to[i]);
	
	int react1[k], react2[k];
	for (int i=0; i<k; i++)
		scanf("%d%d",&react1[i],&react2[i]);

	
	for (int i=0; i<m; i++)
	{
		//cout << "realizuje reakcje " << i << endl;
		//cout << "from " << from[i] << " to " << to[i] << endl;
		for (int j=0; j<fiolka[from[i]].size(); j++)
		{
			//cout << "przebieg petli nr " << j << endl;
			//cout << "aktualna fiolka size " << fiolka[from[i]].size() << endl;
			fiolka[to[i]].push_back(fiolka[from[i]][j]);
			s[fiolka[from[i]][j]] = to[i];
		}
		
		fiolka[to[i]].push_back(from[i]);
		s[from[i]] = to[i];
		
		for (int j=0; j<k; j++)
			if (s[react1[j]] == s[react2[j]]) //substancje w tej samej fiolce
			{
				if (g[react1[j]] > g[react2[j]])
				{
					result += g[react2[j]];
					g[react1[j]] -= g[react2[j]];
					g[react2[j]] = 0;
				}
				else
				{
					result += 2*g[react1[j]];
					g[react2[j]] -= g[react1[j]];
					g[react1[j]] = 0;
				}
			}
	}
	
	cout << result << endl;
	
	return 0;
}