Stable topological sort

前端 未结 6 994
Happy的楠姐
Happy的楠姐 2020-12-29 04:58

Let say I have a graph where the nodes is stored in a sorted list. I now want to topological sort this graph while keeping the original order where the topological order is

6条回答
  •  佛祖请我去吃肉
    2020-12-29 05:18

    The depth-first search algorithm on Wikipedia worked for me:

    const assert = chai.assert;
    
    const stableTopologicalSort = ({
      edges,
      nodes
    }) => {
      // https://en.wikipedia.org/wiki/Topological_sorting#Depth-first_search
      const result = [];
      const marks = new Map();
    
      const visit = node => {
        if (marks.get(node) !== `permanent`) {
          assert.notEqual(marks.get(node), `temporary`, `not a DAG`);
          marks.set(node, `temporary`);
          edges.filter(([, to]) => to === node).forEach(([from]) => visit(from));
          marks.set(node, `permanent`);
          result.push(node);
        }
      };
    
      nodes.forEach(visit);
      return result;
    };
    
    const graph = {
      edges: [
        [5, 11],
        [7, 11],
        [3, 8],
        [11, 2],
        [11, 9],
        [11, 10],
        [8, 9],
        [3, 10]
      ],
      nodes: [2, 3, 5, 7, 8, 9, 10, 11]
    };
    
    assert.deepEqual(stableTopologicalSort(graph), [5, 7, 11, 2, 3, 8, 9, 10]);

提交回复
热议问题