题解 | #【模板】拓扑排序#

【模板】拓扑排序

http://www.nowcoder.com/practice/88f7e156ca7d43a1a535f619cd3f495c

let n = Number(arr[0]), m = Number(arr[1]);
const G = new Array(n+1);
for(let i=0; i<=n; i++) {
    G[i] = {val: i, next: null};
}
// 计算每个结点的入度
const indegree = new Array(n+1).fill(0);
while(m--) {
    const line = readline().split(' ');
    const u = Number(line[0]);  // 起始
    const v = Number(line[1]);  // 结束
    // 有向图
    const newArcNode = {
        val: v, next: null
    }
    const next = G[u].next;
    G[u].next = newArcNode;
    newArcNode.next = next;
    // 计算入度
    indegree[v] ++;
}
const stack = [];  // 暂存所有入度为0的顶点
for (let i=1; i<=n; i++) {
    if (indegree[i] === 0)
        // 入度为0的顶点入栈
        stack.push(i); 
}
const topo = [];  // 记录拓扑序列的顶点序号
while(stack.length > 0) {
    // 出栈,并存入拓扑序列中
    const i = stack.pop()
    topo.push(i);
    // 将顶点P的所有邻接点的入度减1
    let p = G[i].next;
    while(p != null) {
        const k = p.val;
        indegree[k] --;
        if (indegree[k]===0){
            stack.push(k);
        }
        p = p.next;
    }
}
if(topo.length < n) 
    print(-1);
else
    print(topo.join(' '));

全部评论

相关推荐

12-14 11:43
黑龙江大学 Java
用微笑面对困难:确实比较烂,可以这么修改:加上大学的qs排名,然后大学简介要写一些,然后硕士大学加大加粗,科研经历第一句话都写上在复旦大学时,主要负责xxxx,简历左上角把学校logo写上,建议用复旦大学的简历模板
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务