HDU4647_Another Graph Game

有趣的博弈题。

关键在于把比边权的平分到两边的点权上面,然后点权排序,每次从大的开始拿就可以了。

#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;
}
如有转载,请注明出处(http://www.cnblogs.com/lochan)
原文地址:https://www.cnblogs.com/lochan/p/3432313.html