题干:
H公司一共有N名员工,编号为1~N,其中CEO的编号是1。除了CEO之外,每名员工都恰好有唯一的直接上司;N名员工形成了一个树形结构。
我们定义X的1级上司是他的直接上司,2级上司是他上司的上司,以此类推……
请你找出每名员工的D级上司是谁。
Input
第一行包含2个整数N和D。
以下N-1行每行包含一个整数,依次代表编号是2-N的员工的直接上司的编号。
对于50%的数据,1 ≤ N, D ≤ 10000
对于100%的数据,1 ≤ N, D ≤ 100000
Output
依次输出1~N的D级上司的编号,每个一行。如果某员工没有D级上司,输出-1。
Sample Input
5 2 1 1 3 3
Sample Output
-1 -1 -1 1 1
解题报告:
开一个数组记录dfs的过程中走过的节点,跟走迷宫差不多啊只不过网格图换成了树形图。。
AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
vector<int> vv[MAX];
int n,d;
int ans[MAX],dep[MAX];
void dfs(int cur,int root,int deep) {
dep[deep] = cur;
if(deep - d >= 0) ans[cur] = dep[deep-d];
int up = vv[cur].size();
for(int i = 0; i<up; i++) {
int v = vv[cur][i];
if(v == root) continue;
dfs(v,cur,deep+1);
}
}
int main()
{
memset(ans,-1,sizeof ans);
cin>>n>>d;
for(int i = 2,x; i<=n; i++) {
scanf("%d",&x);
vv[x].pb(i);vv[i].pb(x);
}
dfs(1,-1,0);
for(int i = 1; i<=n; i++) {
printf("%d\n",ans[i]);
}
return 0 ;
}
总结:
这题其实应该加单向边但是双向边也可以AC,,我感觉原因就在于是个树形图,又因为是从根节点开始搜的所以每次搜到的边都是上级搜到下级的边,这可以算是个树形图的一个小结论了,其实也很常用,因为貌似所有的树形图都可以这样去使用双向边貌似还没出过错。