#include <stdio.h> #include <stdlib.h> typedef struct {int a,b,k,l;} q; int g[200000],p[200000],l[200000]; q r[500000]; int o(const void *a, const void *b) { int i=(*(q*)a).l-(*(q*)b).l; if (i) return i; return (*(q*)a).k-(*(q*)b).k; } int main() { int n,m,k,i; long long w=0; scanf("%d%d%d",&n,&m,&k); for (i=0;i<n;i++) scanf("%d",&g[i]), p[i]=i, l[i]=m; for (i=0;i<m;i++) { int a,b; scanf("%d%d",&a,&b); a--,b--; p[a]=b; l[a]=i; } for (i=0;i<k;i++) { int c,d,q=m; scanf("%d%d",&c,&d); c--,d--; r[i].a=c; r[i].b=d; r[i].k=i; while (l[c]!=l[d]) l[c]<l[d]? (q=l[c],c=p[c]): (q=l[d],d=p[d]); r[i].l=p[c]==p[d]? q: m; } qsort(r,k,sizeof(*r),o); for (i=0;i<k&&r[i].l<m;i++) { int a=r[i].a,b=r[i].b; int c=g[a]<g[b]?g[a]:g[b]; g[a]-=c; g[b]-=c; w+=c+c; } printf("%lld\n",w); return 0; }
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 | #include <stdio.h> #include <stdlib.h> typedef struct {int a,b,k,l;} q; int g[200000],p[200000],l[200000]; q r[500000]; int o(const void *a, const void *b) { int i=(*(q*)a).l-(*(q*)b).l; if (i) return i; return (*(q*)a).k-(*(q*)b).k; } int main() { int n,m,k,i; long long w=0; scanf("%d%d%d",&n,&m,&k); for (i=0;i<n;i++) scanf("%d",&g[i]), p[i]=i, l[i]=m; for (i=0;i<m;i++) { int a,b; scanf("%d%d",&a,&b); a--,b--; p[a]=b; l[a]=i; } for (i=0;i<k;i++) { int c,d,q=m; scanf("%d%d",&c,&d); c--,d--; r[i].a=c; r[i].b=d; r[i].k=i; while (l[c]!=l[d]) l[c]<l[d]? (q=l[c],c=p[c]): (q=l[d],d=p[d]); r[i].l=p[c]==p[d]? q: m; } qsort(r,k,sizeof(*r),o); for (i=0;i<k&&r[i].l<m;i++) { int a=r[i].a,b=r[i].b; int c=g[a]<g[b]?g[a]:g[b]; g[a]-=c; g[b]-=c; w+=c+c; } printf("%lld\n",w); return 0; } |