Translate C++ Dijkstra to Javascript version

本文介绍了一种使用JavaScript实现的Dijkstra算法,该算法能够计算加权图中两个顶点间的最短路径。通过具体实例展示了如何初始化图、运行算法并获取从起点到终点的最短路径及路径长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

The C++ Dijkstra is at:

http://www.cnblogs.com/tanky_woo/archive/2011/01/19/1939041.html

Calculate the path from 1 to 5!



Here is the Javascript version which is translated from above version:

<script type="text/javascript">
 
	var maxnum = 100;
	var maxint = 999999;
	 
	function Dijkstra(n, v, dist, prev, c)
	{
		var s = [];    // 判断是否已存入该点到S集合中
		for(var i=0; i<n; i++)
		{
			dist[i] = c[v][i];
			s[i] = 0;     // 初始都未用过该点
			if(dist[i] == maxint)
				prev[i] = 0;
			else
				prev[i] = v;
		}

		dist[v] = 0;
		s[v] = 1;
	 
		// 依次将未放入S集合的结点中,取dist[]最小值的结点,放入结合S中
		// 一旦S包含了所有V中顶点,dist就记录了从源点到所有其他顶点之间的最短路径长度
		for(var i=1; i<n; i++)
		{
			var tmp = maxint;
			var u = v;
			// 找出当前未使用的点j的dist[j]最小值
			for(var j=0; j<n; j++) {
				if((!s[j]) && dist[j]<tmp)
				{
					u = j;              // u保存当前邻接点中距离最小的点的号码
					tmp = dist[j];
				}
			}
			s[u] = 1;    // 表示u点已存入S集合中
	 
			// 更新dist
			for(var j=0; j<n; j++) {
				if((!s[j]) && c[u][j]<maxint)
				{
					var newdist = dist[u] + c[u][j];
					if(newdist < dist[j])
					{
						dist[j] = newdist;
						prev[j] = u;
					}
				}
			}
		}
	}
	 
	function searchPath(prev, v, u)
	{
		var que = [];
		var tot = 0;
		que[tot] = u;
		tot++;
		var tmp = prev[u];
		while(tmp != v)
		{
			que[tot] = tmp;
			tot++;
			tmp = prev[tmp];
		}
		que[tot] = v;
		var result = "";
		for(var i=tot; i>=0; --i) {
			if(i != 0) {
				result += que[i] + " -> ";
			} else {
				result += que[i];
			}
		}
		alert("源点到最后一个顶点的路径为: \n" + result);
	}
	 
	function main()
	{
		// 各数组都从下标1开始
		var dist = [];     // 表示当前点到源点的最短路径长度
		var prev = [];     // 记录当前点的前一个结点
		var c = [];   // 记录图的两点间路径长度
		var n, line;             // 图的结点数和路径数
	 
		// 输入结点数
		n = 5;
		// 输入路径数
		line = 7;

		// 初始化c[]为maxint
		for(var i=0; i<n; i++) {
			c[i] = [];
			for(var j=0; j<n; j++) {
				c[i][j] = maxint;
			}
		}
	 
		c[0][1] = 10;
		c[1][0] = 10;
		c[0][3] = 30;
		c[3][0] = 30;
		c[0][4] = 100;
		c[4][0] = 100;
		c[1][2] = 50;
		c[2][1] = 50;
		c[2][4] = 10;
		c[4][2] = 10;
		c[3][2] = 20;
		c[2][3] = 20;
		c[3][4] = 60;
		c[4][3] = 60;
	 
		for(var i=0; i<n; i++)
			dist[i] = maxint;
		var node = "顶点位置: \n";
		for(var i=0; i<n; i++)
		{
			for(var j=0; j<n; j++) {
				node += c[i][j] + "\t";
			}
			node += "\n";
		}
		alert(node);
		
		Dijkstra(n, 0, dist, prev, c);

		// 最短路径长度
		alert("源点到最后一个顶点的最短路径长度: \n" + dist[n-1]);
		// 路径
		searchPath(prev, 0, n-1);
	}
	main();
</script>






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值