描述 Description:
一個只含有一個入口和多個出口的樹型迷宮,裏面分佈着很多的寶藏,每個路口都有一定數量的寶藏,迷宮是單向的,只能從入口開始前行,不能返回,請你從入口進入迷宮,選擇一個合適的出口,使獲得的寶藏數量最多。已知迷宮共有n個路口,1號路口是入口。
輸入格式 Input Format:
第一行:路口的個數n(n<100000)。
第二行:依次是每個路口(按編號1到n的順序)的寶藏數量。
以下又有n-1行:每行兩個數i,j。表示是一條路的起點是i,終點是j。數據保證i<j
輸出格式 Output Format:
一行:從入口到某一出口所能獲得的最大寶藏數量。
輸入樣例:
9
10 20 15 25 30 40 5 20 4
1 2
1 3
1 4
2 5
2 6
3 7
3 8
7 9
輸出樣例:
70
思路:
根據題目把樹隨便建出來,dp。(本題卡常)
代碼:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define loop( i, a, b ) for( long long i = a; i <= b; i++ )
#define maxn 100010
using namespace std;
struct haha {
long long num, dad;
}f[maxn];
long long v[maxn], dp[maxn];
long long n;
void haha_tree() {
long long a, b;
scanf( "%lld", &n );
loop( i, 1, n )
scanf( "%lld", &v[i] );
loop( i, 1, n - 1 ) {
scanf( "%lld%lld", &a, &b );
f[b].dad = a;
f[b].num = i;
}
}
int main() {
haha_tree();
loop( i, 1, n ) {
dp[i] = dp[f[i].dad] + v[i];
}
long long ans;
loop( i, 1, n )
ans = max( ans, dp[i] );
printf( "%lld", ans );
return 0;
}