



dfs序 是很多树问题的基础

时间复杂度:
O(n)
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int n, m;
vector<int> g[N];
int q[N], p[N], top;
int sz[N];
void dfs(int u)
{
sz[u] = 1;
q[top] = u, p[u] = top;
top ++ ;
for (auto v: g[u])
{
dfs(v);
sz[u] += sz[v];
}
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 2; i <= n; i ++ )
{
int t;
scanf("%d", &t);
g[t].push_back(i);
}
dfs(1);
while (m -- )
{
int u, k;
scanf("%d%d", &u, &k);
if (k > sz[u]) puts("-1");
else printf("%d\n", q[p[u] + k - 1]);
}
return 0;
}

本文解析深度优先搜索(DFS)算法在解决树结构问题中的核心作用,探讨其时间复杂度,并通过实例代码展示了如何使用DFS遍历和查找节点。理解DFS是算法竞赛和实际项目中不可或缺的基础技能。
1707

被折叠的 条评论
为什么被折叠?



