最短路径Dijkstra算法注释解析 算法

算法(第四版)423页

 

Dijkstra算法理解

public class DijkstraSP{
	private DirectedEdge[] edgeTo;
	private double[] distTo;
	private IndexMinPQ<Double> pq;
	
	public DijkstraSP(EdgeWeightedDigraph G,int s){
		//最后的最小路径树保存在 edgeTo之中
		edgeTo=new DirectedEdge[G.V()];
		//从s去到每个顶点的距离
		distTo=new double[G.V()];
		//总是删除最小的优先队列
		//他的索引代表顶点,索引对应的值是路径长度
		pq=new IndexMinPQ<Double>(G.V());
		
		//刚开始的时候,s到每一个顶点的距离都是正无穷
		for(int v=0;v<G.V();v++)
			distTo[v]=Double.POSTIVE_INFINITY;
		
		//从s到s的距离为0
		distTo[s]=0.0;
		
		//最开始优先队列中只有从s到s,且距离为0
		pq.insert(s,0.0);
		
		//
		while(!pq.isEmpty){
			relax(G,pq.delMin());//删除最小的元素,并且返回他的索引
		}
	}
	
    private void relax(EdgeWeightedDigraph G,int v){
		for(DirectedEdge e: G.adj(v)){//从v出发的每一条边e
			int w=e.to();//w是e的终点,
			if(distTo[w]>distTo[v]+e.weight()){//如果原本s去w的距离 比 s先到v再到w的距离 长
				distTo[w]=distTo[v]+e.weight();//更新s到w的距离
				edgeTo[w]=e;//到w最后的一条边
				if(pq.contains(w))   pq.change(w,distTo[w]);//如果pq中没有w则加入w,
				else                 pq.insert(w,distTo[w]);
			}
		}
	}	
	public Iterable<DirectedEdge> pathTo(int v){
		if(!hasPathTo(v)) return null;
		Stack<DirectedEdge> path=new Stack<>();
		for(DirectedEdge e=edgeTo[v];e!=null;e=e.edgeTo[e.form]){
			path.push(e);
		}
		return path;
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值