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
 92
 93
 94
 95
 96
 97
 98
 99
100
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;

long long osad;
int n, m, k;
int a, b, c, d;
int ilosc[2000];
int x[2000][2000];
vector <pair <int, int> > w;
vector <int> v[2000];
struct xxx{
	int a, b;
	int p;
}tmp;

struct cmp{
	bool operator () (xxx a, xxx b){
		return a.p<b.p;
	}
};

set <xxx, cmp> secik;
set <xxx, cmp>::iterator it;

int roza, rozb;

void lacz(int a, int b){
	if(x[a][b]!=0){
		tmp.a=a;tmp.b=b;tmp.p=x[a][b];
		secik.insert(tmp);
	}
	roza=v[a].size();
	rozb=v[b].size();
	for(int i=0; i<roza; i++){
		for(int j=0; j<rozb; j++){
			if(x[v[a][i]][v[b][j]]!=0){
				tmp.a=v[a][i];tmp.b=v[b][j];tmp.p=x[v[a][i]][v[b][j]];
				secik.insert(tmp);
			}
			v[v[a][i]].push_back(v[b][j]);
			v[v[b][j]].push_back(v[a][i]);
		}
	}
	for(int i=0; i<roza; i++){
		if(x[v[a][i]][b]!=0){
			tmp.a=v[a][i];tmp.b=b;tmp.p=x[v[a][i]][b];
			secik.insert(tmp);
		}
		v[v[a][i]].push_back(b);
		v[b].push_back(v[a][i]);
	}
	for(int i=0; i<rozb; i++){
		if(x[a][v[b][i]]!=0){
			tmp.a=a;tmp.b=v[b][i];tmp.p=x[a][v[b][i]];
			secik.insert(tmp);
		}
		v[a].push_back(v[b][i]);
		v[v[b][i]].push_back(a);
	}
	v[a].push_back(b);
	v[b].push_back(a);
}

int minimum;
void tworz_osad(){
	while(!secik.empty()){
		it=secik.begin();
		minimum=min(ilosc[it->a], ilosc[it->b]);
		osad=osad+2*minimum;
		ilosc[it->a]-=minimum;
		ilosc[it->b]-=minimum;
		secik.erase(it);
	}
	
}

int main(){
	ios_base::sync_with_stdio(0);
	cin>>n>>m>>k;
	for(int i=1; i<=n; i++)
		cin>>ilosc[i];
	for(int i=0; i<m; i++){
		cin>>a>>b;
		w.push_back(make_pair(a, b));
	}
	for(int i=1; i<=k; i++){
		cin>>c>>d;
		x[c][d]=i;
		x[d][c]=i;
	}
	for(int i=0; i<m; i++){
		lacz(w[i].first, w[i].second);
		tworz_osad();
	}
	cout<<osad<<"\n";
	return 0;
}