这个真的好巧妙啊~
如果只考虑点权的话显然直接按照权值大小排序即可.
但是加入了边权,就有了一个决策的问题.
于是,我们将边权分一半,分给两个端点.
如果一个人拿了两个端点,则边权都会加上.
否则,边权会抵消.
直接按照点权+一半边权排序即可.
code:
#include <bits/stdc++.h>
#define N 100004
#define LL long long
using namespace std;
void setIO(string s)
{
string in=s+".in";
freopen(in.c_str(),"r",stdin);
}
LL a[N];
int main()
{
// setIO("input");
int n,m,i,j;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i) scanf("%lld",&a[i]),a[i]<<=1;
for(i=1;i<=m;++i)
{
int x,y;
LL z;
scanf("%d%d%lld",&x,&y,&z);
a[x]+=z,a[y]+=z;
}
sort(a+1,a+1+n);
LL ans=0ll;
for(i=1;i<n;i+=2)
{
ans+=a[i+1]-a[i];
}
printf("%lld\n",ans/2);
return 0;
}