图和图算法js

用js实现图和图相关算法,方便只会js的童鞋理解噻(参考《js数据结构与算法》)

	//定义类
function Graph(v){
	this.vertices = v; //顶点
	this.vertexList = [];
	this.edges = 0;
	this.adj = [];
	for(var i=0;i<this.vertices;++i){
		this.adj[i] = [];
	};
	//方法
	this.addEdge = addEdge;
	this.showGraph = showGraph;
	this.marked = [];
	this.dfs = dfs;    //深度优先
	for(var i=0;i<this.vertices;++i){
		this.marked[i] = false;
	};
	this.bfs = bfs;    //广度优先
	this.edgeTo = [];   //最短距离,保存一个顶点到下一个顶点的所有边
	this.pathTo = pathTo;
	this.hasPathTo = hasPathTo;
	this.topSortHelper = topSortHelper;
	this.topSort = topSort;
}

//类对应的方法
function addEdge(v,w){
	this.adj[v].push(w);
	this.adj[w].push(v);
	this.edges++;
}


// 用于显示符号名字而非数字的新函数,打印所有顶点及其相邻顶点列表
function showGraph() {         
	var visited = [];
	for ( var i = 0; i < this.vertices; ++i) {
		var str = '';
		visited.push(this.vertexList[i+1]);
		for ( var j = 0; j < this.vertices; ++j ) {
			if (this.adj[i][j] != undefined) {
				if (visited.indexOf(this.vertexList[j]) < 0) {
					str += this.adj[i][j] + ' ';
				}
			}

		}
		console.log(i + '->' + str);
		visited.pop();
	}
}
//深度优先
function dfs(v) {
	this.marked[v] = true;
	if (this.adj[v] != undefined) {
		console.log("Visited vertex: " + v);
	}
	for(var w of this.adj[v]) {
		if (!this.marked[w]) {
			this.dfs(w);
		}
	}
}
//广度优先
function bfs(s){
	var queue = [];    //队列
	this.marked[s] = true;
	queue.push(s);    //添加到队尾,如果用unshift则会由右往左遍历,显示0 2 1 3 4 
	while(queue.length > 0){
		var v = queue.shift();//从队首移除
		if(typeof(v) != 'string'){
			console.log("Visited vertex:" + v);
		};
		for(var w of this.adj[v]){
			if(!this.marked[w]){
				this.edgeTo[w] = v;   
				this.marked[w] = true;
				queue.push(w);
			}
		}
	}
}


function pathTo(startVertices,v) {
	var source = startVertices;             //bfs遍历的开始的点,根据调用bfs传入的参数修改
	if (!this.hasPathTo(v)) {
		return undefined;
	}
	var path = [];
	for (var i = v; i != source; i = this.edgeTo[i]) {
	    path.push(i);
	}
	path.push(source);
	return path;
}
function hasPathTo(v) {
	return this.marked[v];
}
//显示最短距离路径显示的函数
function showShortDiatance(paths){
	var str = '';                 //以下都为输出顺序的显示
	while (paths.length > 0) {
		if (paths.length > 1) {
			str += paths.pop() + '-';
		}
		else {
			str += paths.pop();
		}
	}
	console.log(str);
}
//拓扑排序
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) {     //stack[i] = 0,但是0 != false 是true,所有应该用严等于
			console.log(this.vertexList[stack[i]]);
		}
	}
}
function topSortHelper(v, visited, stack) {
	visited[v] = true;
	for(var w in this.adj[v]) {
		if (!visited[w]) {
			this.topSortHelper(visited[w], visited, stack);
		}
	}
	stack.push(v);
}

//测试拓扑结构
/*g = new Graph(6);
g.addEdge(1, 2);
g.addEdge(2, 5);
g.addEdge(1, 3);
g.addEdge(1, 4);
g.addEdge(0, 1);
g.vertexList = ["CS1", "CS2", "Data Structures",
"Assembly Language", "Operating Systems",
"Algorithms"];
g.showGraph();
g.topSort();*/

//测试其他函数
/*g = new Graph(5);
g.addEdge(0,1);
g.addEdge(0,2);
g.addEdge(1,3);
g.addEdge(2,4);
var startVertices = 0;*/
//console.time('dfs');
//g.dfs(startVertices);            //用时4ms
//console.timeEnd('dfs');
//console.time('bfs');
//g.bfs(startVertices);              //用时16ms
//console.timeEnd('bfs');
//var endVertices = 2;   //从bfs的起点到vertex的最短路径
//var paths = g.pathTo(startVertices,endVertices);
//showShortDiatance(paths);



  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值