题目
有向图中,B依赖A;C依赖A、B;D依赖B、C;A无依赖,要求当依赖编译完成时,才能进行当前节点的编译,求编译的顺序
- 寻找入度为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;
}