无向图 遍历

文章目录

无向图

  • 每个节点到其它节点的方向不确定,所以如果只按照方向遍历,可能会造成相互指向的死循环

dfn 记录

  • 通过一个记录表,初始每个节点代表的数值是0,每遍历一个节点就让数值+1,遍历过程中只遍历数值是0的节点
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];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值