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