原文:算法起步之Dijkstra算法

友情提示:转载请注明出处【作者 idlear    博客:http://blog.csdn.net/idlear/article/details/19687579】

Dijkstra算法是解决带权重有向图上的单源最短路径问题,必须路径值都为正数。如果实现方式合适的话,他的运行时间要低于我们之前介绍的Bellman-Ford算法的运行时间。如果介绍Dijkstra算法的过程你会发现他其实跟我们直接介绍的prim算法非常的相似。他们都是维护一个最小优先队列,最小优先队列维护的值还是key,开始节点到当前节点的最短距离估计。我们不断的从最小优先队列里取节点,加入到我们集合s中,知道最小优先队列为空,则开始节点到所有节点的最短路径就被我们计算出来了,跟prim算法是一样的,也是运用了贪心算法。我们来看一下例图:

public class Dijkstra {

	private int max=10000;
public void Dijkstra(int[][]map,int start,int end){
ArrayList list =new ArrayList();
for (int i = 0; i < map.length; i++) {
if (i==start) {
list.add(new Node(i,0,null));
}else{
list.add(new Node(i,max,null));
}
} while (!list.isEmpty()) {
Collections.sort(list);
Node n=(Node) list.remove(1);
for (int i = 0; i < map.length; i++) {
if (map[n.getId()][i]==0) {
continue;
}
for (Object object : list) {
Node e=(Node) object;
relex(n,e,map[n.getId()][i]);
}
}
} }
public void relex(Node s,Node e,int length){
if (e.getKey()>s.getKey()+length) {
e.setKey(s.getKey()+length);
e.setP(s);
}
} }
class Node implements Comparable<Node>{
private int id;
private int key;
private Node p;
@Override
public int compareTo(Node o) {
if(this.getKey()>o.getKey()){
return -1;
}
return 1;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getKey() {
return key;
}
public void setKey(int key) {
this.key = key;
}
public Node getP() {
return p;
}
public void setP(Node p) {
this.p = p;
}
public Node(int id, int key, Node p) {
super();
this.id = id;
this.key = key;
this.p = p;
} }

算法起步之Dijkstra算法的更多相关文章

  1. 最短路径算法之二——Dijkstra算法

    Dijkstra算法 Dijkstra算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 注意该算法要求图中不存在负权边. 首先我们来定义一个二维数组Edge[MAXN][MAXN]来存储 ...

  2. 算法起步之Kruskal算法

    原文:算法起步之Kruskal算法 说完并查集我们接着再来看这个算法,趁热打铁嘛.什么是最小生成树呢,很形象的一个形容就是铺自来水管道,一个村庄有很多的农舍,其实这个村庄我们可以看成一个图,而农舍就是 ...

  3. 算法起步之Prim算法

    原文:算法起步之Prim算法 prim算法是另一种最小生成树算法.他的安全边选择策略跟kruskal略微不同,这点我们可以通过一张图先来了解一下. prim算法的安全边是从与当前生成树相连接的边中选择 ...

  4. 算法起步之Bellman-Ford算法

    原文:算法起步之Bellman-Ford算法 从这篇开始我们开始介绍单源最短路径算法,他是图算法之一,我们前面说的贪心,图的遍历,动态规划都是他的基础,单源最短路径其实说的就是图中节点到节点的最短路径 ...

  5. 数据结构与算法--最短路径之Dijkstra算法

    数据结构与算法--最短路径之Dijkstra算法 加权图中,我们很可能关心这样一个问题:从一个顶点到另一个顶点成本最小的路径.比如从成都到北京,途中还有好多城市,如何规划路线,能使总路程最小:或者我们 ...

  6. 【Python排序搜索基本算法】之Dijkstra算法

    Dijkstra算法和前一篇的Prim算法非常像,区别就在于Dijkstra算法向最短路径树(SPT)中添加顶点的时候,是按照ta与源点的距离顺序进行的.OSPF动态路由协议就是用的Dijkstra算 ...

  7. 『算法设计_伪代码』贪心算法_最短路径Dijkstra算法

    Dijkstra算法实际上是一个贪婪算法(Greedy algorithm).因为该算法总是试图优先访问每一步循环中距离起始点最近的下一个结点.Dijkstra算法的过程如下图所示. 初始化 给定图中 ...

  8. 算法笔记_068:Dijkstra算法简单介绍(Java)

    目录 1 问题描述 2 解决方案 2.1 使用Dijkstra算法得到最短距离示例 2.2 具体编码   1 问题描述 何为Dijkstra算法? Dijkstra算法功能:给出加权连通图中一个顶点, ...

  9. 最短路径问题---Floyed(弗洛伊德算法),dijkstra算法,SPFA算法

    在NOIP比赛中,如果出图论题最短路径应该是个常考点. 求解最短路径常用的算法有:Floyed算法(O(n^3)的暴力算法,在比赛中大概能过三十分) dijkstra算法 (堆优化之后是O(MlogE ...

随机推荐

  1. 通过ip拨号器来了解广播接收者

    1.继承广播接收者类 package com.example.ipdail; import android.content.BroadcastReceiver; import android.cont ...

  2. 常用字符串string

    字符串 特性: 不可变性 当一个字符串赋新值时,老值依旧在(靠GC来回收) 可以看做是char类型的只读数组 eg:string str="abcd"; str[0]---> ...

  3. c++,为什么要引入虚拟继承

      虚拟基类是为解决多重继承而出现的.   以下面的一个例子为例: #include <iostream.h> #include <memory.h> class CA { i ...

  4. yw info

    浙江省公开招聘聘任制公务员公告 浙江省公开招聘聘任制公务员公告-浙江组织工作网-浙江在线 浙江省公开招聘聘任制公务员公告

  5. VB.net数据库编程(03):一个SQLserver连接查询的简单样例

    这个样例,因为在ADO.net入门已经专门学了,再次进行复习 一下. 主要掌握连接字串的情况. 过程就是: 1.引用System.Data.SqlClient.而Access中引用 的是System. ...

  6. mysql的1067错误 - 2

    上一篇博文<mysql的1067错误>中由于日志配置问题产生1067错误. 由于要升级MySQL到V5.6,所以拷贝my.ini和数据文件到新的系统上. 在启动服务时,又出现1067错误! ...

  7. mac下进行配置android真机调试环境

    学习android开发几天了,今天好不容易找了个android手机,直接连接mac电脑,结果eclipse-DDMS里面没有显示任何设备. 使用命令行adb devices 试了下,没设备列表. 郁闷 ...

  8. 【每日一摩斯】-Troubleshooting: High CPU Utilization (164768.1) - 系列4

    Jobs (CJQ0, Jn, SNPn) Job进程运行用户定义的以及系统定义的类似于batch的任务.检查Job进程占用大量CPU资源的方法,就像检查用户进程一样. 可以根据以下视图检查Job进程 ...

  9. accumulate

    accumulate?就是sum up a range of elements.呵呵.这个挺简单的.以下是这个算法的简单介绍: Syntax: #include <numeric>//呵呵 ...

  10. android ListView和GridView拖拽移位实现代码

    关于ListView拖拽移动位置,想必大家并不陌生,比较不错的软件都用到如此功能了.如:搜狐,网易,百度等,但是相比来说还是百度的用户体验较好,不偏心了,下面看几个示例:             首先 ...