我本来不想做这么蛋疼的事情的,可是更蛋疼的是我看了王大神的博客然后中毒了!我发誓再!不!看!了!
不过问题本身还是有一点意思的,正好学过图论没有实现过dijkstra,刚好在慕课上又学了一点pl/sql。然后就这样一个题目做了一晚上然后还是不想睡觉,赶紧写点代码来压压惊。
 
图片出自http://blog.jobbole.com/70639/ 《真正统治世界的十大算法》
顶点可以忽略,对于有权有向边,一般必须的属性:起点、终点、距离,最后表建出来就是这样

create table EDGE
(
SOURCE VARCHAR2(10) not null,
DESTINATION VARCHAR2(10) not null,
DISTANCE NUMBER(4)
)

对于dijkstra算法来说是计算结果是从源点到其他顶点的最短距离以及最短路径,这个好像没办法用变量保存 
所以再建立一张全局临时表保存计算结果

create global temporary table DISTANCE
(
DESTINATION VARCHAR2(10),--目的点
DISTANCE NUMBER(4),--最短路径
PREVIOUS VARCHAR2(10),--经过的上一个节点
SOURCED VARCHAR2(1)--是否当过源点
)
on commit delete rows;
-- Created on 2015/7/21 by cbwleft
declare
-- Local variables here
va_source edge.source%type:='s';
va_distance Integer:=0;
begin
-- Test statements here
insert into distance(destination,distance,previous) values(va_source,0,va_source);--源点到自己的距离为0
loop
for edge in (select * from edge where source=va_source)--查询邻接边
loop
merge into distance t using dual on (t.destination = edge.destination)
when matched then update set distance = edge.distance+va_distance,previous=va_source where distance>edge.distance+va_distance--如果有更短路径则更新
when not matched then insert values (edge.destination,edge.distance+va_distance,va_source,'');--加入邻接点
end loop;
select max(destination),max(distance) into va_source,va_distance from
(select * from distance t where sourced ='' order by distance) where rownum=1;--贪心
exit when va_source is null;
update distance set sourced='' where destination=va_source;
end loop;
end;
最后在事务提交前执行查询,路径好像最后还得用递归统计一次。

 
比如说查询x到源点的最短路径
SELECT wm_concat(destination) FROM distance START WITH destination = 'x' CONNECT BY destination = PRIOR previous

结果是x,t,y,s

好吧,使用sql实现Dijkstra算法的更多相关文章

  1. 求两点之间最短路径-Dijkstra算法

     Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...

  2. Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解

    /* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...

  3. 关于dijkstra算法的一点理解

    最近在准备ccf,各种补算法,图的算法基本差不多看了一遍.今天看的是Dijkstra算法,这个算法有点难理解,如果不深入想的话想要搞明白还是不容易的.弄了一个晚自习,先看书大致明白了原理,就根据书上的 ...

  4. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

  5. Dijkstra算法(二)之 C++详解

    本章是迪杰斯特拉算法的C++实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnbl ...

  6. Dijkstra算法(一)之 C语言详解

    本章介绍迪杰斯特拉算法.和以往一样,本文会先对迪杰斯特拉算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法 ...

  7. 最短路问题Dijkstra算法

    Dijkstra算法可以解决源点到任意点的最短距离并输出最短路径 准备: 建立一个距离数组d[ n ],记录每个点到源点的距离是多少 建立一个访问数组v[ n ],记录每个点是否被访问到 建立一个祖先 ...

  8. dijkstra算法求最短路

    艾兹格·W·迪科斯彻 (Edsger Wybe Dijkstra,1930年5月11日~2002年8月6日)荷兰人. 计算机科学家,毕业就职于荷兰Leiden大学,早年钻研物理及数学,而后转为计算学. ...

  9. 数据结构之Dijkstra算法

    基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求 ...

随机推荐

  1. 10 Questions To Make Programming Interviews Less Expensive--reference

    Conducting Interview is not cheap and costs both time and money to a company. It take a lot of time ...

  2. spring配置文件位置

    参考http://name327.iteye.com/blog/1628884

  3. tips [终端]

    pbcopy 命令:Place standard output in the clipboard. $ pbcopy < ~/.ssh/id_rsa.pub

  4. c - 十六进制 转 十进制

    考虑到举一反三,这里顺便上完整代码,顺便可以考虑实现R进制和十进制的转换. 完整代码: #include <stdio.h> #include <math.h> double ...

  5. php视图操作

    一.视图的基本介绍          视图是虚拟的表.与包含数据的表不一样,视图只包含使用时动态检索数据的查询.         使用视图需要MySQL5及以后的版本支持.         下面是视图 ...

  6. [转]C++宏定义详解

    一.#define的基本用法     #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能 理解该命令的本质 ...

  7. ubuntu11.10(TQ210)下移植boa服务器

    平台:ubuntu11.10 一.下载源码包www.boa.org   boa-0.94.13.tar.gz 二.解压,在其src目录下生产makefile #tar xvfz  boa-0.94.1 ...

  8. 基础知识 mfc

    句柄 资源的标示  图标句柄(HICON) 光标句柄(HCURSOR) 窗口句柄(HWND) 类似于指针 wm_keydown表示键盘上的按键按下了数值 WPARAM ||LPARAM  两个整形数据 ...

  9. PHPCMS v9构建模块 - 实例之企业服务模块

    下面开始第一个实例,企业服务模块,这是个比较简单的模块,做一个抛砖的作用.   模块功能分析:企业服务,企业填写招聘申请表,管理审核之后,展示作为招聘通知的功能.   ■1.文件分布 modules文 ...

  10. Windows下更改MySQL数据库的存储位置

    在MySQL安装完成后,要修改数据库存储的位置,比如从安装目录下的C:\Program Files\MySQL\MySQL Server 5.0\Data文件夹转移到D:\mySQLData文件夹. ...