迷宮尋寶

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章