HDU-6201 transaction transaction transaction(树dp / 最长(短)路)

来源:互联网 发布:淘宝fake鞋店 编辑:程序博客网 时间:2024/06/06 16:52

题目:http://acm.hdu.edu.cn/showproblem.php?pid=6201
题意:n个城市,n-1条路,商人要选一个城市买书,一个城市卖书,每个城市都有对应的price,每条路都有对应的的花费,求最大的money
思路:
树dp,dp[u][0]代表买书最大收益,dp[u][1]代表卖书最大收益
dp[u][0] = max(dp[u][0],dp[v][0]-w);
dp[u][1] = max(dp[u][1],dp[v][1]-w);
最长路(最短路)参考http://www.cnblogs.com/Blackops/p/7501966.html
代码:

#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e5+5;struct edge{    int v,w;};vector<edge> G[N];int maxn,dp[N][2],p[N];void dfs(int u,int fa){    dp[u][0] = -p[u];    dp[u][1] = p[u];    for(auto e : G[u])    {        int v = e.v,w = e.w;        if(v == fa)            continue;        dfs(v,u);        dp[u][0] = max(dp[u][0],dp[v][0]-w);        dp[u][1] = max(dp[u][1],dp[v][1]-w);    }    maxn = max(maxn,dp[u][0]+dp[u][1]);}int main(){    int T,n;    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        for(int i = 1;i <= n;i++)            G[i].clear();        for(int i = 1;i <= n;i++)            scanf("%d",&p[i]);        --n;        while(n--)        {            int u,v,w;            scanf("%d%d%d",&u,&v,&w);            G[u].push_back({v,w});            G[v].push_back({u,w});        }        maxn = -0x3f3f3f3f;        dfs(1,-1);        printf("%d\n",maxn);    }    return 0;}
阅读全文
0 0