您的位置:首页 > 其它

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

2017-09-12 15:55 381 查看
题目: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
;
int maxn,dp
[2],p
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: