#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
#define PB(x) push_back(x)
#define Si size()
#define be begin()
#define en end()
struct Edge{
int v, rev, p;
Edge() {}
Edge(int a, int b, int c)
: v(a), rev(b), p(c) {}
};
struct Ed{
int i, j, p;
Ed() {}
Ed(int a, int b, int c)
: i(a), j(b), p(c) {}
} Q[500000];
inline bool operator<(const Ed& a, const Ed& b){
return (a.p<b.p);
}
struct Tr{
int a, b;
} t[500000];
vector<Edge> G[200001];
vector<int> S[200001];
int p[200001];
int g[200001];
void Union(int x, int y){
if(S[x].Si>S[y].Si)
swap(x, y);
for(int i=0;i<S[y].Si;++i){
S[x].PB(S[y][i]);
p[S[y][i]]=x;
}
S[y].clear();
}
void EraseEdge(int u, int j){
int w=G[u][j].v;
int r=G[u][j].rev;
if(r!=G[w].Si-1){
swap(G[w][r], G[w][G[w].Si-1]);
G[G[w][r].v][G[w][r].rev].rev=r;
}
G[w].pop_back();
if(j!=G[u].Si-1){
swap(G[u][j], G[u][G[u].Si-1]);
G[G[u][j].v][G[u][j].rev].rev=j;
}
G[u].pop_back();
}
void EraseNode(int u){
for(int i=0;i<G[u].Si;++i)
EraseEdge(u, i);
}
int main()
{
ll res=0;
int n, m, k, a, b;
scanf("%d%d%d", &n, &m, &k);
for(int i=1;i<=n;++i){
scanf("%d", g+i);
S[i].PB(i);
p[i]=i;
}
for(int i=0;i<m;++i)
scanf("%d%d", &t[i].a, &t[i].b);
for(int i=0;i<k;++i){
scanf("%d%d", &a, &b);
G[a].PB(Edge(b, G[b].Si, i));
G[b].PB(Edge(a, G[a].Si-1, i));
}
for(int i=0;i<m;++i){
int x=p[t[i].a];
int y=p[t[i].b];
if(S[x].Si>S[y].Si)
swap(x, y);
int q=0;
for(int j=0;j<S[y].Si;++j)
if(!g[S[y][j]])
EraseNode(S[y][j]);
else{
for(int e=0;e<G[S[y][j]].Si;++e){
int v=G[S[y][j]][e].v;
int pa=G[S[y][j]][e].p;
if(p[v]==x) Q[q++]=Ed(j, v, pa);
}
}
sort(Q, Q+q);
for(int i=0;i<q;++i)
if(g[S[y][Q[i].i]]<=g[Q[i].j]){
res+=(g[S[y][Q[i].i]]<<1);
g[Q[i].j]-=g[S[y][Q[i].i]];
g[S[y][Q[i].i]]=0;
EraseNode(S[y][Q[i].i]);
}else{
res+=(g[Q[i].j]<<1);
g[S[y][Q[i].i]]-=g[Q[i].j];
g[Q[i].j]=0;
EraseNode(Q[i].j);
}
Union(x, y);
}
printf("%lld", res);
}
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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | #include <cstdio> #include <algorithm> #include <vector> using namespace std; typedef long long ll; #define PB(x) push_back(x) #define Si size() #define be begin() #define en end() struct Edge{ int v, rev, p; Edge() {} Edge(int a, int b, int c) : v(a), rev(b), p(c) {} }; struct Ed{ int i, j, p; Ed() {} Ed(int a, int b, int c) : i(a), j(b), p(c) {} } Q[500000]; inline bool operator<(const Ed& a, const Ed& b){ return (a.p<b.p); } struct Tr{ int a, b; } t[500000]; vector<Edge> G[200001]; vector<int> S[200001]; int p[200001]; int g[200001]; void Union(int x, int y){ if(S[x].Si>S[y].Si) swap(x, y); for(int i=0;i<S[y].Si;++i){ S[x].PB(S[y][i]); p[S[y][i]]=x; } S[y].clear(); } void EraseEdge(int u, int j){ int w=G[u][j].v; int r=G[u][j].rev; if(r!=G[w].Si-1){ swap(G[w][r], G[w][G[w].Si-1]); G[G[w][r].v][G[w][r].rev].rev=r; } G[w].pop_back(); if(j!=G[u].Si-1){ swap(G[u][j], G[u][G[u].Si-1]); G[G[u][j].v][G[u][j].rev].rev=j; } G[u].pop_back(); } void EraseNode(int u){ for(int i=0;i<G[u].Si;++i) EraseEdge(u, i); } int main() { ll res=0; int n, m, k, a, b; scanf("%d%d%d", &n, &m, &k); for(int i=1;i<=n;++i){ scanf("%d", g+i); S[i].PB(i); p[i]=i; } for(int i=0;i<m;++i) scanf("%d%d", &t[i].a, &t[i].b); for(int i=0;i<k;++i){ scanf("%d%d", &a, &b); G[a].PB(Edge(b, G[b].Si, i)); G[b].PB(Edge(a, G[a].Si-1, i)); } for(int i=0;i<m;++i){ int x=p[t[i].a]; int y=p[t[i].b]; if(S[x].Si>S[y].Si) swap(x, y); int q=0; for(int j=0;j<S[y].Si;++j) if(!g[S[y][j]]) EraseNode(S[y][j]); else{ for(int e=0;e<G[S[y][j]].Si;++e){ int v=G[S[y][j]][e].v; int pa=G[S[y][j]][e].p; if(p[v]==x) Q[q++]=Ed(j, v, pa); } } sort(Q, Q+q); for(int i=0;i<q;++i) if(g[S[y][Q[i].i]]<=g[Q[i].j]){ res+=(g[S[y][Q[i].i]]<<1); g[Q[i].j]-=g[S[y][Q[i].i]]; g[S[y][Q[i].i]]=0; EraseNode(S[y][Q[i].i]); }else{ res+=(g[Q[i].j]<<1); g[S[y][Q[i].i]]-=g[Q[i].j]; g[Q[i].j]=0; EraseNode(Q[i].j); } Union(x, y); } printf("%lld", res); } |
English