/* * è·¯å¾æ¥è¯¢ */ module.exports = class Path { // æé 彿°ï¼å¯»è·¯ç®æ³ï¼å¯»æ¾å¾graphä»sç¹å°å ¶ä»ç¹çè·¯å¾ constructor(g, s) { this.data = g.g; // è·åä¼ å ¥å¾çæ°æ® this.visited = new Array(g.V()).fill(false); // è®°å½èç¹æ¯å¦è¢«è®¿é®è¿ if(s > g.V()) s = g.V()-1; // 鲿¢è¶ç this.s = s; // èµ·å§ç¹ this.from = new Array(g.V()).fill(-1); // è®°å½è·¯å¾ï¼from[i]è¡¨ç¤ºæ¥æ¾çè·¯å¾ä¸içä¸ä¸ªèç¹ // å¯»è·¯ç®æ³ this.dfs(s); } // å¾ç深度ä¼å éå dfs(v) { this.visited[v] = true; for(let i = 0; i < this.data[v].length; i++) { if(!this.visited[this.data[v][i]]) { this.from[this.data[v][i]] = v; this.dfs(this.data[v][i]); } } } // æ¥è¯¢ä»sç¹å°wç¹æ¯å¦æè·¯å¾ hasPath(w) { if(w < 0 || w > this.data.length) return false; return this.visited[w]; } // æ¥è¯¢ä»sç¹å°wç¹çè·¯å¾ path(w) { if(!this.hasPath(w)) return; var s = []; // éè¿fromæ°ç»é忥æ¾å°ä»så°wçè·¯å¾ï¼åæ¾å°æ ä¸ var p = w; while(p !== -1) { s.push(p); p = this.from[p]; } // äº¤æ¢æ°ç»é¡ºåº var res = s.reverse(); return res; } // æå°åºä»så°wç¹çè·¯å¾ showPath(w) { if(!this.hasPath(w)) return; var res = this.path(w); var str = ""; for(let i = 0; i < res.length; i++) { str += res[i]; if(i === res.length-1) { str += "\n"; } else { str += " -> "; } } console.log(str); } }