BZOJ2563 阿狸和桃子的游戏

  将边权平均分到两顶点,按点权从大到小取即可。这样的话如果某人取到两点则获得边权,否则对两人均无影响,并且最后每条边都会处于其中的一种情况。假装证明了正确性。

#include<iostream> 
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
    int x=0,f=1;char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
    while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return x*f;
}
#define N 10010
int n,m,a[N],ans;
int main()
{
#ifndef ONLINE_JUDGE
    freopen("bzoj2563.in","r",stdin);
    freopen("bzoj2563.out","w",stdout);
    const char LL[]="%I64d\n";
#else
    const char LL[]="%lld\n";
#endif
    n=read(),m=read();
    for (int i=1;i<=n;i++) a[i]=read()<<1;
    for (int i=1;i<=m;i++)
    {
        int x=read(),y=read(),z=read();
        a[x]+=z,a[y]+=z;
    }
    sort(a+1,a+n+1);reverse(a+1,a+n+1);
    for (int i=1;i<=n;i++)
    if (i&1) ans+=a[i];else ans-=a[i];
    cout<<(ans>>1);
    return 0;
}

 

posted @ 2018-09-03 01:58  Gloid  阅读(108)  评论(0编辑  收藏  举报