const Dict = require('../Dict/Dict'); const Queue = require('../Queue/Queue'); /* * å®ä¹å¾çç±» */ var Graph = function (vertices) { // 屿§ this.vertexes = []; // åå¨é¡¶ç¹ this.adjList = new Dict(); // åå¨è¾¹ this.edgeTo = []; // ç¨äºè®°å½æçè·¯å¾ }; // æ·»å èç¹ Graph.prototype.addVertex = function (v) { this.vertexes.push(v); this.adjList.set(v, []); this.edgeTo[v] = []; } // æ·»å è¾¹ Graph.prototype.addEdge = function (v, w) { this.adjList.get(v).push(w); this.adjList.get(w).push(v); } // è¾åºå¾ Graph.prototype.toString = function () { var resultStr = ""; for (var i = 0; i < this.vertexes.length; i++) { resultStr += this.vertexes[i] + "->"; var adj = this.adjList.get(this.vertexes[i]); for (var j = 0; j < adj.length; j++) { resultStr += adj[j] + " "; } resultStr += "\n"; } return resultStr; } // 深度ä¼å éåââä½¿ç¨æ æ¥è¾ å©å®ç° Graph.prototype.dfs = function (start) { // è·åèç¹ var v = start ? this.vertexes[start]: this.vertexes[0]; // èç¹å ç´ å ¥æ var stack = [v]; // ç¨æ°ç»æ¥å¨å访é®çèç¹ var visited = []; var i; while (stack.length !== 0) { var v = stack.pop(); visited.push(v); var edge = this.adjList.get(v); for (i = 0; i < edge.length; i++) { // å½è·åçèç¹æ²¡æè®¿é®è¿å¹¶ä¸æ²¡æåå ¥æ ä¸ï¼åå°å ¶åå ¥æ ä¸ if (visited.indexOf(edge[i]) === -1 && stack.indexOf(edge[i]) === -1) { stack.push(edge[i]); } } } // è¿åæ°æ® return visited; }; // 广度ä¼å éåââ使ç¨éåæ¥è¾ å©å®ç° Graph.prototype.bfs = function (start) { // è·åå½åçèç¹ var n = start ? this.vertexes[start]: this.vertexes[0]; // å建éå var queue = new Queue(); // å°ä¼ å ¥çé¡¶ç¹æ¾å ¥éåä¸ queue.enqueue(n); // 设置æ°ç»ç¨äºåå¨å¹¿åº¦éåçèç¹ var visited = []; var i; while (!queue.empty()) { // ä»éåä¸ååºæ°æ® var v = queue.dequeue(); // æ·»å å°è®¿é®è¿çæ°ç»ä¸ visited.push(v); // 访é®ç®å该èç¹è½å°è¾¾çä¸ä¸ä¸ªèç¹ var edge = this.adjList.get(v); for (i = 0; i < edge.length; i++) { // å½è·åçèç¹æ²¡æè®¿é®è¿å¹¶ä¸æ²¡æåå ¥æ ä¸ï¼åå°å ¶åå ¥æ ä¸ï¼å¹¶ä¸ä¿åè·¯å¾ if (visited.indexOf(edge[i]) === -1 && queue.has(edge[i]) === -1) { // è®°å½ä»nç´¢å¼å°iç´¢å¼éè¦ç»è¿vç´¢å¼,å³è®°å½ä¸è¯¥èç¹å¯¹åºçç´¢å¼ this.edgeTo[n][edge[i]] = v; queue.enqueue(edge[i]); } } } return visited; }; // è¾åºå°ä¸¤ä¸ªèç¹é´çæçè·¯å¾ Graph.prototype.pathTo = function (v, w) { var i = this.vertexes.indexOf(v); if (this.edgeTo[v].length === 0) { this.bfs(i); } var path = []; // 循ç¯ååè·¯å¾ï¼ç´æ¥æ¾å°vèç¹çç´¢å¼ var edges = this.edgeTo[v]; for (var i = w; i != v; i = edges[i]) { path.push(i); } path.push(v); // å转æ°ç»ï¼ä»w -> v åæä» v -> w path = path.reverse(); return path; }; // æææåº:䏿·±åº¦ä¼å æç´¢ç±»ä¼¼ï¼ä¸åçæ¯ï¼æææåºç®æ³ä¸ä¼ç«å³è¾åºå·²è®¿é®çé¡¶ç¹ï¼èæ¯è®¿é®å½åé¡¶ç¹é»æ¥è¡¨ä¸ææçç¸é» // é¡¶ç¹ï¼ç´å°è¿ä¸ªå表穷尽æ¶ï¼æå°å½åé¡¶ç¹åå ¥æ ä¸ã Graph.prototype.topSort = function () { var topSortResult = []; var visited = []; for (var i = 0; i < this.vertexes.length; i++) { visited[i] = false; } for (var j = 0; j < this.vertexes.length; j++) { if (visited[i] !== false) { this.topSortHelper(j, visited, topSortResult); } } var ret = []; for (var k = 0; k < topSortResult.length; k++) { ret.push(this.vertexes[topSortResult[k]]); } return ret.reverse(); }; // è¾ å©å½æ°ï¼ éè¿æ·±åº¦ä¼å éåãï¼å¯ä»¥ä½¿ç¨æ å®ç°ï¼ Graph.prototype.topSortHelper = function (v, visited, topSortResult) { visited[v] = true; var n = this.vertexes[v]; var w; for (var i = 0; i < this.adjList.get(n).length; i++) { w = this.adjList.get(n)[i]; w = this.vertexes.indexOf(w); if (!visited[w]) { this.topSortHelper(w, visited, topSortResult); } } if (topSortResult.indexOf(v) === -1) { // éåå®è¿æ¥çèç¹åï¼åæèªèº«å ¥æ ã topSortResult.push(v); } }; module.exports = Graph;