有趣的博弈题。
关键在于把比边权的平分到两边的点权上面,然后点权排序,每次从大的开始拿就可以了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 100100
using namespace std;
double a[maxn];
int n,m,u,v;
double w,s1,s0;
int main()
{
while (scanf("%d%d",&n,&m)!=EOF)
{
for (int i=1; i<=n; i++) scanf("%lf",&a[i]);
while (m--)
{
scanf("%d%d%lf",&u,&v,&w);
w/=2;
a[u]+=w,a[v]+=w;
}
sort(a+1,a+1+n);
s1=s0=0; m=1;
for (int i=n; i>0; i--)
{
if (m&1) s0+=a[i];
else s1+=a[i];
m++;
}
printf("%.0f
",s0-s1);
}
return 0;
}