把边权转换为点权。具体来说,把一条边的边权各一半加到两个顶点上,然后每个人选的时候,贪心的选取点权最大的点即可。
如果一条边的两个顶点被同一个人选上了,那么它就会额外提供等同于边权的贡献;否则的话,两个人每人都有一半边权的收益,相当于这条边谁也没给,也是符合题意的。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 2e5+7;
ll val[maxn],num[maxn],n,m;
bool cmp1(long long a,long long 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;
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
val[x]+=z;
val[y]+=z;
}
sort(val+1,val+1+n,cmp1);
ll ans=0;
for(int i=1;i<n;i+=2)
ans+=val[i]-val[i+1];
cout<<ans/2;
}