JavaScript数据结构-7-8DAG拓扑排序

<!DOCTYPE html>
<html>
<head>
	<title>拓扑排序</title>
	<meta charset="utf-8">
	<script type="module" src="DAG.js"></script>
</head>
<body>

</body>
</html>
import SqStack from './SqStack.js';
class DAG {
    constructor() {
        this.sides = [];
        this.vertex = new Map();
        this.index = [];
    }
    addVertex(v) {
        var i = this.vertex.size;
        this.vertex.set(v, i);
        this.index[this.index.length] = v;
        this.sides[i] = [];
        this.sides[i][i] = null;
    }
    addSide(a, b, value) {
        var i = this.vertex.get(a);
        var j = this.vertex.get(b);
        if (value == null) value = 1;
        this.sides[i][j] = value;
        // this.sides[j][i] = value; //无向图
    }
    sort() {
        //数组存储结果
        var results = [];
        //初始化数组indegree,记录每一个顶点的入度
        var indegree = new Array(this.vertex.size);
         for (var i=0 ;i<indegree.length;i++){
            indegree[i]=0;
         }
        for (var i = 0; i < this.sides.length; i++) {
            for (var j = 0; j < this.sides[i].length; j++) {
                if (this.sides[i][j] != null) {
               //     if (!indegree[j]) indegree[j] = 0;
                    indegree[j]++;
                }
            }
        } //end for 
        //将入度为0的顶点入栈
        var SqStackF = SqStack();
        var Stack = new SqStackF();
        for (var i = 0; i < indegree.length; i++) {
            if (indegree[i] == 0) Stack.Push(i);
        }
        while (!Stack.StackEmpty()) {
            var u = Stack.Pop();
            results.push(u);
            for (var v = 0; v < this.sides[u].length; v++) {
                if (this.sides[u][v] != null) {
                    indegree[v]--;
                    if (indegree[v] == 0) {
                        Stack.Push(v);
                    }
                }
            }
        } //end while
        if (results.length != this.vertex.size) {
            return false;
        } else {
            return results;
        }
    }
}
var graph = new DAG();
graph.addVertex(1);
graph.addVertex(2);
graph.addVertex(3);
graph.addVertex(4);
graph.addVertex(5);
graph.addSide(1, 2);
graph.addSide(1, 4);
graph.addSide(2, 4);
graph.addSide(2, 3);
graph.addSide(4, 3);
graph.addSide(3, 5);
graph.addSide(4, 5);
console.log(graph.sort().map(x=>graph.index[x]));

这添加自定义标签需要冲会员的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值