一个不错的题目。因为是求两人得分的差值,所以我们将边权对半分,分别加在所连接的两点上,这样如果两边是不同的人拿的话,相减就等于没有拿,而如果是相同的人拿,就相当于拿全了,但是为了避免浮点数,所以采用点权乘二,最后答案/2
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 100020
#define LL long long
using namespace std;
LL val[maxn],n,m;
bool cmp(const LL& a,const LL& b){return a>b;}
int main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",val+i),val[i]*=2;
LL a,b,c;
for(int i=1;i<=m;i++){
scanf("%lld%lld%lld",&a,&b,&c);
val[a]+=c,val[b]+=c;
}
sort(val+1,val+1+n,cmp);LL ans=0;
for(int i=1;i<=n;i++){
if(i&1)ans+=val[i];
else ans-=val[i];
}
printf("%lld",ans/2);
return 0;
}