UNPKG

ts-ds-tool

Version:

Data structure and algorithm of TypeScript

111 lines (105 loc) 3.55 kB
const {Queue , HashMap , dijkstra , PriorityQueue , isconnected , Graph , GraphVertex , HashSet , MinHeap} = require("./dist/data-structure"); function topoSort(graph){ if (!graph){ return []; } const clonedGraph = graph; const vertices = clonedGraph.getVertexs(); const queue = new PriorityQueue(); vertices.forEach(item => queue.enqueue(item, -item.getInDegree())); const topoSortedArr = []; while (!queue.isEmpty()){ const {Value: vertex , Priority: indegree} = queue.dequeue(); if (indegree < 0){ throw new Error("Cyclic dependency " + vertex.Key); } topoSortedArr.push(vertex); const head = vertex.getEdges(); while (head.Size){ const edge = head.getHeadNode().Value; vertex.deleteEdge(edge); queue.changePriority(edge.EndVertex, -edge.EndVertex.getInDegree()); } } return topoSortedArr; } const vertexA = new GraphVertex("A"); const vertexB = new GraphVertex("B"); const vertexC = new GraphVertex("C"); const vertexD = new GraphVertex("D"); const vertexE = new GraphVertex("E"); const vertexF = new GraphVertex("F"); vertexA.addEdge(vertexB); vertexA.addEdge(vertexC); vertexA.addEdge(vertexD); vertexC.addEdge(vertexB); vertexC.addEdge(vertexE); vertexD.addEdge(vertexE); vertexF.addEdge(vertexD); vertexF.addEdge(vertexE); const graph = new Graph(); graph .addVertex(vertexA) .addVertex(vertexB) .addVertex(vertexC) .addVertex(vertexD) .addVertex(vertexE) .addVertex(vertexF); const vertexs = topoSort(graph); // const edgeSet = new HashSet(); // function getEulerCircuit( // graph, // edges, // startVertex, // existHashMap, // prevKey){ // if (!startVertex){ // startVertex = graph.getVertexs()[0]; // } // if (!edges){ // edges = []; // } // if (!startVertex || !graph.findVertex(startVertex.Key)){ // return []; // } // existHashMap = existHashMap || new HashMap(graph.getKeys().length); // const nextNodes = startVertex.getNeighbors(); // existHashMap.put(startVertex.Key , true); // nextNodes.forEach(item => { // if(item.Key === prevKey){ // return; // } // const edgeKey = JSON.stringify([startVertex.Key,item.Key].sort((a,b) => a>b?1:-1)); // if(!edgeSet.has(edgeKey)){ // if (existHashMap.get(item.Key)){ // edges.push(startVertex.getEdge(item.Key)); // }else{ // existHashMap.put(item.Key,true); // getEulerCircuit(graph , edges, item , existHashMap , startVertex.Key); // edges.push(startVertex.getEdge(item.Key)); // } // edgeSet.add(edgeKey); // } // }); // return edges; // } // const graph = new Graph(false); // const vertexs = Array.from({length:10},(item,index) => new GraphVertex(index.toString())); // vertexs.forEach(item => graph.addVertex(item)); // graph // .addEdge(vertexs[0],vertexs[8]) // .addEdge(vertexs[0],vertexs[9]) // .addEdge(vertexs[8],vertexs[7]) // .addEdge(vertexs[9],vertexs[2]) // .addEdge(vertexs[9],vertexs[3]) // .addEdge(vertexs[2],vertexs[1]) // .addEdge(vertexs[3],vertexs[1]) // .addEdge(vertexs[9],vertexs[7]) // .addEdge(vertexs[7],vertexs[6]) // .addEdge(vertexs[7],vertexs[5]) // .addEdge(vertexs[6],vertexs[5]); // const edges = getEulerCircuit(graph); // console.log(edges); // const map = edges.map(item => [item.StartVertex.Key,item.EndVertex.Key]); // console.log(map);