hihocoder-1851-D级上司
#1851 : D级上司
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
H公司一共有N名员工,编号为1~N,其中CEO的编号是1。除了CEO之外,每名员工都恰好有唯一的直接上司;N名员工形成了一个树形结构。
我们定义X的1级上司是他的直接上司,2级上司是他上司的上司,以此类推……
请你找出每名员工的D级上司是谁。
输入
第一行包含2个整数N和D。
以下N-1行每行包含一个整数,依次代表编号是2-N的员工的直接上司的编号。
对于50%的数据,1 ≤ N, D ≤ 10000
对于100%的数据,1 ≤ N, D ≤ 100000
输出
依次输出1~N的D级上司的编号,每个一行。如果某员工没有D级上司,输出-1。
- 样例输入
-
5 2 1 1 3 3
- 样例输出
-
-1 -1 -1 1 1
题解:
1,构建二叉树,并从根节点开始便利;
2, 利用dfs遍历,并找到其d层祖先。
#include <cstdio> #include <iostream> #include <vector> using namespace std; const int MAXN = 100000 + 10; int n, k; int ans[MAXN], tmp[MAXN]; vector<int> nd[MAXN]; void dfs(int cur_node, int cur_lv) { tmp[cur_lv] = cur_node; if(cur_lv - k > 0) { ans[cur_node] = tmp[cur_lv-k]; }else{ ans[cur_node] = -1; } for(int i=0;i<nd[cur_node].size(); ++i) { dfs(nd[cur_node][i], cur_lv+1); } } int main(){ int x; while(scanf("%d %d", &n, &k) != EOF) { for(int i=2; i<=n; ++i) { scanf("%d", &x); nd[x].push_back(i); } dfs(1, 1); for(int i=1; i<=n; ++i) { printf("%d ", ans[i]); } for(int i=1; i<=n;++i) { nd[i].clear(); } } return 0; }