图 拓扑排序

222 阅读1分钟

题目

有向图中,B依赖A;C依赖A、B;D依赖B、C;A无依赖,要求当依赖编译完成时,才能进行当前节点的编译,求编译的顺序

image.png

  • 寻找入度为0的点,然后擦去它影响到的节点的入度(入度-1),然后继续寻找入度为0的点,因为是有向图,所以一定会有入度为0的点
  • 首先找到入度为0的A,然后擦去其影响,B的入度变为0,C的入度变为1,D的入度为2
  • 然后找到入度为0的B,擦去其影响,C的入度变为0,D的入为变为1
  • 然后找到入度为0的C,擦去其影响,D的入度变为0
  • 所以最后的编译顺序为:ABCD
function sortedTopology(graph) {
  //存放每个节点的入度
  const inMap = new Map();
  //存放入度为0的节点
  const zeroInQueue = [];
  //遍历图的所有节点
  graph.nodes.values.forEach((node) => {
    inMap.put(node.in);
    //拿到第一波入度为0的节点
    if (node.in === 0) {
      zeroInQueue.add(node);
    }
  });

  const result = [];
  while (zeroInQueue.length) {
    //弹出每一个入度为0的点,然后擦去影响
    const node = zeroInQueue.shift();
    result.push(node);
    node.nexts.forEach((node) => {
      //入度为0的点所指向的节点的入度都-1,因为该节点将被擦去
      inMap.set(node, inMap.get(node) - 1);
      if (inMap.get(node) === 0) {
        zeroInQueue.add(node);
      }
    });
  }

  return result;
}