AcWing 3215. 网络延时
原题链接
中等
作者:
王小强
,
2021-02-19 23:04:31
,
所有人可见
,
阅读 373
这道题的本质就是求N叉树的直径!
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int n, m, p, ans;
unordered_map<int, vector<int>> g;
int dfs(int cur) {
int first = 0, second = 0;
for (const int child : g[cur]) {
int d = dfs(child);
if (d > first) second = first, first = d;
else if (d > second) second = d;
}
ans = max(ans, first + second);
return 1 + first;
}
int main(void) {
scanf("%d%d", &n, &m);
for (int i = 2; i <= n; ++i) {
scanf("%d", &p);
g[p].emplace_back(i);
}
for (int i = 1; i <= m; ++i) {
scanf("%d", &p);
g[p].emplace_back(-i); // 为了防止和交换机编号重复,我刻意用负数作为电脑的编号!!!
}
dfs(1);
printf("%d\n", ans);
}
请问这里的dfs函数里的return 1+first 的+1是为什么?
就是当前节点本身. 你想想如果是叶节点的话 底下没有最大深度first, 次大深度second! max(0, 0) == 0
明白了ヾ(❀╹◡╹)ノ~