#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); } |
English