如果只有点或边的话,十分简单对吧,但是,现在都有。怎么办呢?
我们可以吧边权分在点上,怎么分,一般的想法就是对半分。但这样对不对呢?感性认识,由于是算分差,,如果两个人各选了一条边的一个端点,没有影响,不然的话,选了两个端点的人能超一个边权。那,这样就是对的。
排序后,轻松解决。
#include<bits/stdc++.h>
using namespace std;
int n,m;
int x,y,val;
int A[10001];
int Ans;
bool cmp(const int &A,const int &B)
{
return A>B;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&A[i]);
for(int i=1;i<=n;i++)A[i]<<=1;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&val);
A[x]+=val;
A[y]+=val;
}
sort(A+1,A+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(i%2)Ans+=A[i];
else Ans-=A[i];
}
cout<<Ans/2;
return 0;
}