描述 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;
}