# 图（Graph）的javascript实现

• graph；

• some-graph。

## 编程思路

• 深度优先遍历使用递归，但需要设定外部状态数组，因此使用了一个小技巧；

• 最短路径为不加权的，加权的应该需要经典的Dijkstra算法，以后再继续完善；

• 注意拓扑排序与深度优先遍历的异同；

• 以模块模式组织代码；

## 自己的实现

Graph.js

``````(function(){
"use strict";
function Graph(v){
this.vertexs = v;
this.vertexList = [];
this.edges = 0;
this._vertex_marked = [];
this._edgeTo = [];          //保存可达路径
}

//拓扑排序
Graph.prototype.topSort = function(){
var stack = [];
var visited = [];
for(var i =0; i < this.vertexs; i++){
visited[i] = false;
}
for(var i = 0; i < this.vertexs; i++){
if(visited[i] == false){
this.topSortHelper(i, visited, stack);
}
}
var al = stack.pop();
while(al != null){
console.log(this.vertexList[al]);
al = stack.pop();
}
};

Graph.prototype.topSortHelper = function(v, visited, stack){
visited[v] = true;
}
}
stack.push(v);
};

Graph.prototype.initMarked = function(){
for(var i = 0; i< this.vertexs; i++){
this._vertex_marked[i] = false;
}
};

Graph.prototype.pathTo = function(v){
var start = 0;
this.bfs(start);
if(!this.hasPathTo(v)){
return null;
}
var path = [];
for(var i = v; i != start; i = this._edgeTo[i]){
path.push(i);
}
path.push(start);
var rs = "";
while(path.length > 0){
if(path.length > 1){
rs += path.pop() + "-";
}
else{
rs += path.pop();
}
}
return rs;
};

Graph.prototype.hasPathTo = function(v){
return this._vertex_marked[v];
};

//广度优化遍历,并生成可达路径,为计算无权最短路径提供数据
Graph.prototype.bfs = function(v){
this.initMarked();
var queue = [];
this._vertex_marked[v] = true;
queue.push(v);
while(queue.length > 0){
var cur = queue.shift();
console.log("Visited vertex: " + cur);
}
}
}
};

//深度优先遍历
Graph.prototype.dfs = function(v){
if(arguments[1] == undefined){
this.initMarked();
}
this._vertex_marked[v] = true;
console.log("Visited vertex: " + v);
}
}
};

Graph.prototype.display = function(){
for(var i = 0; i < this.vertexs; i++){
console.log(i + " --> This vertex is isolate.")
}else{
console.log(i + " --> " + this.adj[i].join(" "))
}
}
};

}
}
this.edges++;
};

module.exports = Graph;
})();``````

## 源代码地址

``````https://github.com/zhoutk/js-data-struct
http://git.oschina.net/zhoutk/jsDataStructs``````

#### 你可能感兴趣的

5 条评论

zhoutk 作者 · 2015年11月19日

var Graph = require('./graph');
var g = new Graph(6);
g.dfs(0);

zhoutk 作者 · 2015年11月19日