# js数据结构和算法（四）图和图算法

2

**

## 图类

### 表示顶点

``````function Vertex(label){
this.label = label;
}``````

## 构建图

``````function Graph(v){
this.vertices = v;//vertices至高点
this.edges = 0;
for(var i =0;I<this.vertices;++i){
}
this.toString = toString;
}``````

``````function addEdge(){
this.edges++;
}``````

## 图的遍历

### 深度优先遍历

``````this.marked = [];//保存已访问过的顶点
for(var i=0;i<this.vertices;++i){
this.marked[i] = false;//初始化为false
}
``````

``````function dfs(v){
this.marked[v] = true;
//if语句在这里不是必须的
print("Visited vertex: " + v );
if(!this.marked[w]){
this.dfs(w);
}
}
}
}
``````

## 广度优先搜索

`````` 1. 首先查找与当前顶点相邻的未访问的顶点，将其添加到已访问顶点列表及队列中；
2. 然后从图中取出下一个顶点v，添加到已访问的顶点列表
3. 最后将所有与v相邻的未访问顶点添加到队列中``````

``````function bfs(s){
var queue = [];
this.marked = true;
queue.push(s);//添加到队尾
while(queue.length>0){
var v = queue.shift();//从队首移除
if(v == undefined){
print("Visited vertex: " + v);
}
if(!this.marked[w]){
this.edgeTo[w] = v;
this.marked[w] = true;
queue.push(w);
}
}
}
}``````

### 确定路径

``````this.edgeTo = [];//将这行添加到Graph类中

//bfs函数
function bfs(s){
var queue = [];
this.marked = true;
queue.push(s);//添加到队尾
while(queue.length>0){
var v = queue.shift();//从队首移除
if(v == undefined){
print("Visited vertex: " + v);
}
if(!this.marked[w]){
this.edgeTo[w] = v;
this.marked[w] = true;
queue.push(w);
}
}
}
}
``````

## 拓扑排序算法

``````//topSort()函数
function topSort(){
var stack = [];
var visited = [];
for(var i =0;i<this.vertices;i++){
visited[i] = false;
}
for(var i = 0;i<this.vertices;i++){
if(visited[i] == false){
this.topSortHelper(i,visited,stack);
}
}
for(var i = 0;i<stack.length;i++){
if(stack[i] !=undefined && stack[i] != false){
print(this.vertexList[stack[i]]);
}
}
}

//topSortHelper()函数
function topSortHelper(v,visited,stack){
visited[v] = true;
if(!visited[w]){
this.topSortHelper(visited[w],visited,stack);
}
}
stack.push(v);
}

``````

3 条评论

`//topSort()函数
function topSort(){

``````var stack = [];
var visited = [];
for(var i =0;i<this.vertices;i++){
visited[i] = false;
}
for(var i = 0;i<this.vertices;i++){
if(visited[i] == false){
this.topSortHelper(i,visited,stack);
}
}
for(var i = 0;i<stack.length;i++){``````

//这里使用=! 是非常不规范的， 这将造成强制类型转换，比如这里就会忽略0， 这里应该使用 !== 本书中作者大量使用了这种不规范的写法

``````    if(stack[i] !=undefined && stack[i] != false){
print(this.vertexList[stack[i]]);
}
}``````

}

//topSortHelper()函数
function topSortHelper(v,visited,stack){

``visited[v] = true;``

//for each只在firefox才有效，for each本身也不是JS的语法，该书大范围使用for each可以说将给读者很大的误导

``````for each(var w in this.adj[v]){
if(!visited[w]){
this.topSortHelper(visited[w],visited,stack); //这里居然把visited[w]放入递归， 而visited[w]的值是false，这里的参数应该是w
}
}
stack.push(v);//push放在末尾这样将在递归的时候被挂起， 这条语句应该放在递归之前。``````

}`

+2 回复