每个边权分配到两个点。
两人权值相减,若一条边分属两人,则为点权相减。
否则,为点+权-点。
sort贪心即可。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxv 10050 using namespace std; long long n,m,w[maxv],x,y,z; int main() { scanf("%lld%lld",&n,&m); for (long long i=1;i<=n;i++) { scanf("%lld",&w[i]); w[i]*=2; } for (long long i=1;i<=m;i++) { scanf("%lld%lld%lld",&x,&y,&z); w[x]+=z;w[y]+=z; } long long ans=0; sort(w+1,w+n+1); for (long long i=n;i>0;i-=2) ans+=(w[i]-w[i-1]); printf("%lld\n",ans/2); return 0; }