声明:端点
u
,
v
u,v
u,v,边权
d
i
s
dis
dis,两端点权值
v
a
l
u
,
v
a
l
v
val_u,val_v
valu,valv
若两个端点都选:获得的价值
=
v
a
l
u
′
+
v
a
l
v
′
=
v
a
l
u
+
d
i
s
2
+
v
a
l
v
+
d
i
s
2
=
v
a
l
u
+
v
a
l
v
+
d
i
s
=val_u'+val_v'=val_u+\frac{dis}{2}+val_v+\frac{dis}{2}=val_u+val_v+dis
=valu′+valv′=valu+2dis+valv+2dis=valu+valv+dis和原来一样
若只选一个端点:获得的价值
=
v
a
l
u
′
−
v
a
l
v
′
=
v
a
l
u
+
d
i
s
2
−
(
v
a
l
v
+
d
i
s
2
)
=
v
a
l
u
−
v
a
l
v
=val_u'-val_v'=val_u+\frac{dis}{2}-(val_v+\frac{dis}{2})=val_u-val_v
=valu′−valv′=valu+2dis−(valv+2dis)=valu−valv符合题意
所以贪心思想显然正确。
#include<bits/stdc++.h>usingnamespace std;constint maxn =1e4+100;template<typename T>inlinevoidread(T &s){
s =0;
T w =1, ch =getchar();while(!isdigit(ch)){if(ch =='-') w =-1; ch =getchar();}while(isdigit(ch)){ s =(s <<1)+(s <<3)+(ch ^48); ch =getchar();}
s *= w;}int n, m;double ans;double val[maxn];intmain(){read(n),read(m);for(int i =1; i <= n;++i)scanf("%lf",&val[i]);for(int i =1; i <= m;++i){int x, y;double z;read(x),read(y);scanf("%lf",&z);
val[x]+= z /2*1.0;
val[y]+= z /2*1.0;}sort(val +1, val + n +1);for(int i = n; i >=1;--i){if(i &1) ans -= val[i];else ans += val[i];}printf("%.0lf\n", ans);return0;}