题目
- 根据题意可以转换成如下的数据结构
- 每个节点都是无向图(方向不确定),用数据结构来表示如下
- 从0位置开始深度遍历,统计出每一个节点的所有子节点和花费,当前节点花费=下一层所有子节点花费+下一层每个(子节点及其下级节点的所有数量/5)向上取整
function process(a, b, n) {
const graph = new Map();
for (let i = 0; i <= n; i++) {
graph.set(i, []);
}
// 构造无向图
for (let i = 0; i <= a.length; i++) {
graph.get(a[i]).push(b[i]);
graph.get(b[i]).push(a[i]);
}
// 无向图统计节点是否已经遍历,非0表示未遍历
const dfn = Array(n + 1).fill(0);
// 每个节点的所有下级节点数量
const size = Array(n + 1).fill(0);
// 每个节点到其它节点的花费
const cost = Array(n + 1).fill(0);
let count = 0;
dfs(graph, 0, dfn, size, cost);
function dfs(graph, cur, dfn, size, cost) {
// 标记节点已遍历
dfn[cur]++;
// 当前节点算上自身
size[cur] = 1;
const childs = graph.get(cur);
for (let i = 0; i <= childs.length; i++) {
const next = childs[i];
if (dfs[next] === 0) {
dfs(graph, next, dfn, size, cost);
// 统计当前节点+子节点的数量
size[cur] += size[next];
// 统计子节点的花费
cost[cur] += cost[next];
// 子节点的花费+(子节点人数/5)向上取余 统计出下一个节点到当前节点的花费
cost[cur] += Math.floor(size[next] / 5);
}
}
}
// 从 0 开始深度遍历,最后返回 0 位置的结果
return cost[0];
}