[AppleScript] syntaxhighlighter_viewsource syntaxhighlighter_copycode
#include<stdio.h>
#include<cmath>
#include<iostream>
#include<algorithm>
#define LL long long
#define N 510001
using namespace std;
struct Node{int d,id,s,e;}P[N];
int n,m,k,cnt;
bool vis[N];
int End[2*N],Last[N],Next[2*N],W[N],F[N][20],D[N],A[N],B[N],C[N],Dd[N],Fa[N];
void add(int x,int y){cnt++;End[cnt]=y;Next[cnt]=Last[x];Last[x]=cnt;}
int GF(int x){return Fa[x]==x?x:Fa[x]=GF(Fa[x]);}
bool cmp(Node x,Node y){
if(x.d==y.d)return x.id<y.id;
return x.d>y.d;
}
void DFS(int x){
vis[x]=1;
for(int i=1;i<=ceil(log2(D[x]));i++)F[x]=F[F[x][i-1]][i-1];
for(int i=Last[x];i;i=Next)D[End]=D[x]+1,F[End][0]=x,DFS(End);
}
int LCA(int x,int y){
if(D[x]<D[y])swap(x,y);
int k=D[x]-D[y];
for(int i=0;i<=ceil(log2(k));i++)if(k&(1<<i))x=F[x];
if(x==y)return x;
for(int i=18;i>=0;i--)if(F[x]!=F[y])x=F[x],y=F[y];
return F[x][0];
}
int main(){
int f1,f2,a,b,tot;
LL ans=0;
scanf("%d%d%d",&n,&m,&k);
tot=n;
for(int i=1;i<=n;i++)scanf("%d",&W),Fa=i;
for(int i=1;i<=m;i++)scanf("%d%d",&A,&B);
for(int i=1;i<=k;i++)scanf("%d%d",&C,&Dd);
for(int i=1;i<=m;i++){
f1=GF(A);f2=GF(B);
++tot;
add(tot,f1);add(tot,f2);
Fa[f1]=Fa[f2]=Fa[tot]=tot;
}
for(int i=tot;i>=1;i--)if(!vis)DFS(i);
tot=0;
for(int i=1;i<=k;i++){
f1=GF(C);f2=GF(Dd);
if(f1!=f2)continue;
P[++tot].d=D[LCA(C,Dd)];
P[tot].s=C[tot].e=Dd[tot].id=tot;
}
sort(P+1,P+1+tot,cmp);
for(int i=1;i<=tot;i++){
a=min(W[P.s],W[P.e]);
ans+=2LL*a;
W[P.s]-=a;W[P.e]-=a;
}
printf("%lld",ans);
}