题目: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;
}