图和图算法
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>图</title> </head> <body> </body> </html> <script> function Graph(v){ var i; this.vertices = v; this.edges = 0; this.adj = []; for (i = 0; i < this.vertices; i++) { this.adj[i] = []; }; //深度 this.visited = []; //广度 this.marked = []; for(i=0; i<this.vertices;i++){ this.visited[i] = false; this.marked[i] = false; } //路径 this.edgeTo=[]; } Graph.prototype = { //增加边 addEdge:function(v,m){ this.adj[v].push(m); this.adj[m].push(v); this.edges++; }, //深度搜索 depSrch:function(v){ var i; var m; var temp; this.visited[v] = true; if(this.visited[v]){ console.log("visited:"+v) } for (i = 0; i < this.vertices; i++) { for(m in this.adj[i]){ temp = this.adj[i][m]; if(!this.visited[temp]){ this.depSrch(temp); } } }; }, //广度搜索 bfs:function(v){ var queue = []; var i; var m; var k,temp; queue.push(v); this.marked[v] = true; while(queue.length > 0){ k = queue.shift(); console.log("visited:"+k); for(m in this.adj[k]){ temp = this.adj[k][m]; if(!this.marked[temp]){ this.edgeTo[temp] = k; this.marked[temp] = true; queue.push(temp); } } } }, //广度搜索最短路径 pathTo:function(v){ var source = 0; var path = []; var i; if(!this.marked[v]){ return undefined; } for(i=v;i!=source;i=this.edgeTo[i]){ path.push(i); } path.push(source); return path; } } var g = new Graph(5); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 3); g.addEdge(2, 4); g.depSrch(0); g.bfs(0); var paths = g.pathTo(4); var str = ""; while(paths.length > 0){ if(paths.length >1){ str += paths.pop()+"-"; }else{ str += paths.pop(); } } document.write(str); </script>