看题解有大佬有用树状dp的,还有说正解是长链剖分。。。
我太菜了,上面那些都不会,用dfs遍历ac了,不知道是不是数据太水让我水过了。正应了ACM圈一句名言“这题我虽然不会,但ac还是没问题的”。
先用结构体建树:
struct node {
int l, r;
}tree[maxn];
输入:
for (int i = 1; i <= n; i++) cin >> tree[i].l >> tree[i].r;
dfs遍历树并更新答案:
void dfs(int u, int deep)
{
if (u == 0)return;//叶节点返回
ans = max(ans, deep);
dfs(tree[u].l, deep + 1);
dfs(tree[u].r, deep + 1);
return;
}
完整ac代码:
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 1000000+10
struct node {
int l, r;
}tree[maxn];
int ans;
void dfs(int u, int deep)
{
if (u == 0)return;
ans = max(ans, deep);
dfs(tree[u].l, deep + 1);
dfs(tree[u].r, deep + 1);
return;
}
int main(void)
{
int n;
cin >> n;
for (int i = 1; i <= n; i++) cin >> tree[i].l >> tree[i].r;
dfs(1, 1);
cout << ans;
return 0;
}