Magic boy Bi Luo with his excited tree
Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 723 Accepted Submission(s): 192
Problem Description
Bi Luo is a magic boy, he also has a migic tree, the tree has
N
nodes , in each node , there is a treasure, it's value is
V[i], and for each edge, there is a cost
C[i], which means every time you pass the edge
i
, you need to pay
C[i].
You may attention that every
V[i]
can be taken only once, but for some
C[i]
, you may cost severial times.
Now, Bi Luo define
ans[i]
as the most value can Bi Luo gets if Bi Luo starts at node
i.
Bi Luo is also an excited boy, now he wants to know every
ans[i], can you help him?
Input
First line is a positive integer
T(T≤104)
, represents there are
T
test cases.
Four each test:
The first line contain an integer
N
(N≤105).
The next line contains
N
integers
V[i], which means the treasure’s value of node
i(1≤V[i]≤104).
For the next
N−1
lines, each contains three integers
u,v,c
, which means node
u
and node
v
are connected by an edge, it's cost is
c(1≤c≤104).
You can assume that the sum of
N
will not exceed
106.
Output
For the i-th test case , first output Case #i: in a single line , then output
N
lines , for the i-th line , output
ans[i]
in a single line.
Sample Input
1 5 4 1 7 7 7 1 2 6 1 3 1 2 4 8 3 5 2
Sample Output
Author
UESTC
Source
2016中国大学生程序设计竞赛 - 网络选拔赛
题意:说给一棵树,点和边都有权值,经过一点可以加上该点的权值但最多只加一次,经过边会减去该边权值,问从各个点分别出发最多能获得多少权值。
分析:两个DFS分别在O(n)处理出两种信息,各个结点往其为根的子树走的信息和各个结点往父亲走的信息,各个结点就能在O(1)合并这两个信息分别得出各个结点的最终信息。。
参考大神博客:http://www.cnblogs.com/WABoss/p/5771931.html
#pragma comment(linker, "/STACK:102400000,102400000")
#include
#include
#include
#include
#include
#include