1. 程式人生 > >CSU 1869 中南大學網路賽C題 樹上最大值

CSU 1869 中南大學網路賽C題 樹上最大值

題目:

Description

現在給你一棵根節點編號為1的樹,每個節點上都有對應的權值, 求出樹上每一層的最大值。(根節點所在位置視為第一層,由此可推,根節點的兒子是處於第二層,etc)

Input

多組資料讀入 第一行輸入一個正整數n表示樹上有n個節點(n<=100000),下一行輸入n個正整數v1,v2....vn表示n個節點上對應的權值(vi<=100000), 再下一行輸入n-1個正整數(第i個數字v表示,節點i+1的父親是v,保證v<i+1)

Output

從樹自頂向下輸出每一層的最大值是多少,每個值之間用空格隔開,全部輸出後末尾換行。

Sample Input

6
10 6 8 7 3 2
1 2 1 4 4

Sample Output

10 7 8

程式碼:

#include<iostream>
using namespace std;

int deep[100001], x[100001],m[100001];

int main()
{
	int n, p;
	while (cin >> n)
	{
		for (int i = 1; i <= n; i++)scanf("%d", &x[i]);
		deep[1] = 1;
		for (int i = 2; i <= n; i++)
		{
			cin >>
p; deep[i] = deep[p] + 1; } for (int i = 1; i <= n; i++)m[i] = 0; for (int i = 1; i <= n; i++)if (m[deep[i]] < x[i])m[deep[i]] = x[i]; for (int i = 1; i <= n; i++) { if (m[i] == 0)break; cout << m[i] << " "; } cout << endl; } return 0; }