<!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>