http://acm.hdu.edu.cn/showproblem.php?pid=4647
树上的博弈,直接把边权平分到两边的节点上,然后排个序,从大往小取
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 100100; int n , m; double a[maxn]; int main() { while(~scanf("%d%d",&n,&m)) { for(int i=1;i<=n;i++) scanf("%lf" , &a[i]); int u , v; double w; while(m--) { scanf("%d%d%lf",&u,&v,&w); w /= 2.0; a[u] += w; a[v] += w; } sort(a+1 , a+n+1); double ans = 0; for(int i=n;i>=1;i-=2) { ans += a[i] - a[i-1]; } printf("%.0lf\n" , ans); } return 0; }