#include <iostream> #include <cstdio> #include <ctime> #include <set> #include <vector> #include <algorithm> #define LL long long #define ff first #define ss second #define PB push_back #define MP make_pair #define DEBUG(x) cerr<<#x<<" "<<(x)<<endl; using namespace std; const int N = 200005, K = 500005; int n, m, k, a, b, size; int zostalo[N], From[N], To[N], rep[N]; vector<pair<int, int> >V[N]; vector<int>zbior[N]; pair<pair<int, int>, int>S[K]; int find(int w) { if(rep[w] == w) return w; rep[w] = find(rep[w]); return rep[w]; } int main() { scanf("%d%d%d", &n, &m, &k); for(int i=1; i<=n; i++) scanf("%d", &zostalo[i]); for(int i=1; i<=m; i++) scanf("%d%d", &From[i], &To[i]); for(int i=1; i<=k; i++) { scanf("%d%d", &a, &b); V[a].PB(MP(i, b)); V[b].PB(MP(i, a)); } for(int i=1; i<=n; i++) { rep[i] = i; zbior[i].PB(i); } LL wynik = 0; for(int i=1; i<=m; i++) { a = find(From[i]); b = find(To[i]); if(zbior[b].size() < zbior[a].size()) swap(a, b); size = 0; for(int j=0; j<zbior[a].size(); j++) { int w = zbior[a][j]; if(!zostalo[w])continue; for(int l=V[w].size()-1; l>=0; l--) { int u = V[w][l].ss; if(find(u) == b) { S[++size] = MP(V[w][l], w); swap(V[w][l], V[w].back()); V[w].pop_back(); } } } sort(S+1, S+1+size); for(int j=1; j<=size; j++) { int w = S[j].ss; int u = S[j].ff.ss; if(zostalo[w] >= zostalo[u]) { zostalo[w] -= zostalo[u]; wynik += zostalo[u]; zostalo[u] = 0; } else { zostalo[u] -= zostalo[w]; wynik += zostalo[w]; zostalo[w] = 0; } } for(int j=0; j<zbior[a].size(); j++) { int w = zbior[a][j]; if(zostalo[w]) zbior[b].PB(w); } zbior[a].clear(); rep[a] = b; } printf("%lld", 2*wynik); }
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 <cstdio> #include <ctime> #include <set> #include <vector> #include <algorithm> #define LL long long #define ff first #define ss second #define PB push_back #define MP make_pair #define DEBUG(x) cerr<<#x<<" "<<(x)<<endl; using namespace std; const int N = 200005, K = 500005; int n, m, k, a, b, size; int zostalo[N], From[N], To[N], rep[N]; vector<pair<int, int> >V[N]; vector<int>zbior[N]; pair<pair<int, int>, int>S[K]; int find(int w) { if(rep[w] == w) return w; rep[w] = find(rep[w]); return rep[w]; } int main() { scanf("%d%d%d", &n, &m, &k); for(int i=1; i<=n; i++) scanf("%d", &zostalo[i]); for(int i=1; i<=m; i++) scanf("%d%d", &From[i], &To[i]); for(int i=1; i<=k; i++) { scanf("%d%d", &a, &b); V[a].PB(MP(i, b)); V[b].PB(MP(i, a)); } for(int i=1; i<=n; i++) { rep[i] = i; zbior[i].PB(i); } LL wynik = 0; for(int i=1; i<=m; i++) { a = find(From[i]); b = find(To[i]); if(zbior[b].size() < zbior[a].size()) swap(a, b); size = 0; for(int j=0; j<zbior[a].size(); j++) { int w = zbior[a][j]; if(!zostalo[w])continue; for(int l=V[w].size()-1; l>=0; l--) { int u = V[w][l].ss; if(find(u) == b) { S[++size] = MP(V[w][l], w); swap(V[w][l], V[w].back()); V[w].pop_back(); } } } sort(S+1, S+1+size); for(int j=1; j<=size; j++) { int w = S[j].ss; int u = S[j].ff.ss; if(zostalo[w] >= zostalo[u]) { zostalo[w] -= zostalo[u]; wynik += zostalo[u]; zostalo[u] = 0; } else { zostalo[u] -= zostalo[w]; wynik += zostalo[w]; zostalo[w] = 0; } } for(int j=0; j<zbior[a].size(); j++) { int w = zbior[a][j]; if(zostalo[w]) zbior[b].PB(w); } zbior[a].clear(); rep[a] = b; } printf("%lld", 2*wynik); } |