1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>拓扑排序</title> 6 </head> 7 <body> 8 <script> 9 function topSort(){ 10 var stack = []; 11 var visited = []; 12 for(var i=0;i<this.vertices;i++){ 13 visited[i] = false; 14 } 15 for(var i = 0;i<this.vertices;i++){ 16 if(visited[i] == false){ 17 this.topSortHelper(i,visited,stack); 18 } 19 } 20 for(var i = 0;i<stack.length;i++){ 21 if(stack[i] != undefined && stack[i] != false){ 22 console.log(this.vertexList[stack[i]]); 23 } 24 } 25 } 26 function topSortHelper(v,visited,stack){ 27 visited[v] = true; 28 for (var k in this.adj[v]){ 29 var w = this.adj[v][k]; 30 if(!visited[w]){ 31 this.topSortHelper(visited[w],visited,stack); 32 } 33 } 34 stack.push(v); 35 } 36 37 function addEdge(v,w){ 38 this.adj[w].push(v); 39 this.adj[v].push(w); 40 this.edges++; 41 } 42 43 function showGraph(){ 44 var visited = []; 45 for(var i = 0;i<this.vertices;i++){ 46 console.log(this.vertexList[i]+"->"); 47 visited.push(this.vertexList[i]); 48 for(var j = 0;j < this.vertices;j++){ 49 if(this.adj[i][j] != undefined){ 50 if(visited.indexOf(this.vertexList[j]) < 0){ 51 console.log(this.vertexList[j]+" "); 52 } 53 } 54 } 55 visited.pop(); 56 } 57 } 58 59 //深度优先搜索 60 function dfs(v){ 61 this.marked[v] = true; 62 //输出一下 63 if(this.adj[v] != undefined){ 64 console.log("已访问 :"+v); 65 } 66 for(var i = 0;i<this.adj[v].length;i++){ 67 var w = this.adj[v][i]; 68 if(!this.marked[w]){ 69 this.dfs(w); 70 } 71 } 72 } 73 74 //广度优先 75 function bfs(s){ 76 var queue = []; 77 this.marked[s] = true; 78 queue.unshift(s); 79 while(queue.length > 0){ 80 var v = queue.shift(); 81 if(typeof(v) != 'string'){ 82 console.log("已访问 :"+v); 83 } 84 for(var k in this.adj[v]){ 85 var w = this.adj[v][k]; 86 if(!this.marked[w]){ 87 this.edgeTo[w] = v; 88 this.marked[w] = true; 89 queue.unshift(w); 90 } 91 } 92 } 93 } 94 95 function pathTo(v){ 96 var source = 0; 97 if(!this.hasPathTo(v)){ 98 return undefined; 99 } 100 var path = []; 101 for(var i = v;i != source;i=this.edgeTo[i]){ 102 path.push(i); 103 } 104 path.push(source); 105 return path; 106 } 107 function hasPathTo(v){ 108 return this.marked[v]; 109 } 110 function Graph(v){ 111 this.vertices = v; 112 this.vertexList = []; 113 this.edges = 0; 114 this.adj = []; 115 for(var i=0;i<this.vertices;i++){ 116 this.adj[i] = []; 117 } 118 this.addEdge = addEdge; 119 this.showGraph = showGraph; 120 this.dfs = dfs; 121 this.edgeTo = []; 122 this.marked = []; 123 for(var i=0;i<this.vertices;i++){ 124 this.marked[i] = false; 125 } 126 this.bfs = bfs; 127 this.hasPathTo = hasPathTo; 128 this.topSortHelper = topSortHelper; 129 this.topSort = topSort; 130 } 131 132 133 //测试 134 var obj = new Graph(6); 135 obj.addEdge(1,2); 136 obj.addEdge(2,5); 137 obj.addEdge(1,3); 138 obj.addEdge(1,4); 139 obj.addEdge(0,1); 140 obj.vertexList = ["css1","css2","data structures","javascript","operating system","html"]; 141 obj.showGraph(); 142 obj.topSort(); 143 </script> 144 </body> 145 </html>