您的位置:首页 > 理论基础 > 计算机网络

CSU 1869 中南大学网络赛C题 树上最大值

2017-04-15 21:36 267 查看
题目:


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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: