Hdu 6201 transaction transaction transaction 树型DP
来源:互联网 发布:建材价格查询软件 编辑:程序博客网 时间:2024/05/18 12:28
transaction transaction transaction
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total Submission(s): 118 Accepted Submission(s): 52
Problem Description
Kelukin is a businessman. Every day, he travels around cities to do some business. On August 17th, in memory of a great man, citizens will read a book named "the Man Who Changed China". Of course, Kelukin wouldn't miss this chance to make money, but he doesn't have this book. So he has to choose two city to buy and sell.
As we know, the price of this book was different in each city. It isai yuan in i t city. Kelukin will take taxi, whose price is 1 yuan per km and this fare cannot be ignored.
There aren−1 roads connecting n cities. Kelukin can choose any city to start his travel. He want to know the maximum money he can get.
As we know, the price of this book was different in each city. It is
There are
Input
The first line contains an integer T (1≤T≤10 ) , the number of test cases.
For each test case:
first line contains an integern (2≤n≤100000 ) means the number of cities;
second line containsn numbers, the i th number means the prices in i th city; (1≤Price≤10000)
then followsn−1 lines, each contains three numbers x , y and z which means there exists a road between x and y , the distance is z km (1≤z≤1000) .
For each test case:
first line contains an integer
second line contains
then follows
Output
For each test case, output a single number in a line: the maximum money he can get.
Sample Input
1 4 10 40 15 30 1 2 301 3 23 4 10
Sample Output
8
Source
2017 ACM/ICPC Asia Regional Shenyang Online
求一棵树上的max(a[i]-a[j]-Dij), i!=j, 其中Dij表示 i , j 树上路径长度。
这是一道树型DP.
对于每个固定的 i , 我们发现:a[i]不变,只要使a[j]+Dij最小。
既然是树型DP,我们可以先只考虑某节点 i 和它的子树,从叶子向上DP。用dp[i]表示在某节点 i 卖出,在它和它的子树上买入的最小的a[j]+Dij.
如果 j 是 i 的儿子,那么所有 j 以下的点都必然经过 i 到 j 的路径,代价必然先加上这条边的长度。如果起点是 j, 代价加上a[j]即可;否则,由于我们已经求出 j 和它子树上的最优解,所以这些点到 i 的最优解代价是到 j 的最优解加上边长。
这样dfs一次,可以求出某点为终点,子树上买入的最优解。
对于某点的父节点以上的其他点,同样可以自上到下DP,过程与自上至下类似,把子节点换成父节点即可。再dfs一次,即可求出答案。
#include <cstdio>#include <iostream>#include <string.h>#include <string> #include <map>#include <queue>#include <vector>#include <set>#include <algorithm>#include <math.h>#include <cmath>#include <stack>#define mem0(a) memset(a,0,sizeof(a))#define meminf(a) memset(a,0x3f,sizeof(a))using namespace std;typedef long long ll;typedef long double ld;typedef double db;const int maxn=100005,inf=0x3f3f3f3f; const ll llinf=0x3f3f3f3f3f3f3f3f; const ld pi=acos(-1.0L);int dp[maxn],head[maxn],a[maxn],d[maxn];bool visit[maxn],f[maxn];int num,ans;struct Edge {int from,to,pre,dist;};Edge edge[maxn*2];void addedge(int from,int to,int dist) {edge[num]=(Edge){from,to,head[from],dist};head[from]=num++;edge[num]=(Edge){to,from,head[to],dist};head[to]=num++;}void dfs(int now) {visit[now]=1;dp[now]=inf;d[now]=inf;for (int i=head[now];i!=-1;i=edge[i].pre) {int to=edge[i].to;if (!visit[to]) {dfs(to);d[now]=min(d[now],edge[i].dist+d[to]);dp[now]=min(dp[now],min(dp[to],a[to])+edge[i].dist);}}if (d[now]==inf) d[now]=0;}void dfs2(int now,int fa,int dist) {visit[now]=1;if (fa!=-1) dp[now]=min(dp[now],min(dp[fa]+dist,a[fa]+dist)); for (int i=head[now];i!=-1;i=edge[i].pre) {int to=edge[i].to;if (!visit[to])dfs2(to,now,edge[i].dist);}ans=max(ans,a[now]-dp[now]);}int main() {int cas;scanf("%d",&cas);while (cas--) {int n,i,x,y,d;scanf("%d",&n);num=0;memset(head,-1,sizeof(head));for (i=1;i<=n;i++) scanf("%d",&a[i]);for (i=1;i<n;i++) {scanf("%d%d%d",&x,&y,&d);addedge(x,y,d);}mem0(visit);dfs(1);ans=-inf;mem0(visit);dfs2(1,-1,0);printf("%d\n",ans);}return 0;}
阅读全文
0 0
- Hdu 6201 transaction transaction transaction 树型DP
- HDU-6201 transaction transaction transaction(树形dp)
- HDU 6201 transaction transaction transaction(dp)
- hdu 6201 transaction transaction transaction tree dp
- HDU 6201 transaction transaction transaction dp
- hdu 6201 transaction transaction transaction 树形dp
- hdu 6201transaction transaction transaction
- HDU 6201 transaction transaction transaction
- hdu 6201 transaction transaction transaction
- HDU 6201 transaction transaction transaction
- hdu-6201 transaction transaction transaction
- hdu 6201 transaction transaction transaction
- HDU 6201 transaction transaction transaction【树形DP||SPFA最长路】
- HDU 6201 transaction transaction transaction(树形dp)
- HDU 6201 transaction transaction transaction (树形dp)
- transaction transaction transaction HDU
- transaction transaction transaction HDU
- HDU 6201 transaction transaction transaction [网络流]
- 1002 cable cable cable
- 23. Merge k Sorted Lists
- 欢迎使用CSDN-markdown编辑器
- 玩具装箱(noip冲刺模拟题——DP)
- java
- Hdu 6201 transaction transaction transaction 树型DP
- 关于yield的骚操作
- 随笔 无题
- 关于手机访问电脑localhost问题
- springMVC框架原理
- Nginx面试中最常见的18道题 抱佛脚必备
- 1076: 三位数求解
- 34muduo_net库源码分析(十)
- 三级缓存