我本来不想做这么蛋疼的事情的,可是更蛋疼的是我看了王大神的博客然后中毒了!我发誓再!不!看!了!
不过问题本身还是有一点意思的,正好学过图论没有实现过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. 第二节,CCSpriteBatchNode CCSpriteFrameCache

    1,CCSpriteBatchNode 精灵集合类 其中Batch的英文含义是一批,一群的意思.他的对象常常包含了许多的精灵对象,这些精灵对象有一个共同的特点,那就是使用同一张文理图片.虽然是同一个纹 ...

  2. [转] Python正则表达式指南

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...

  3. Creating a Swap Partition

    Creating a Swap Partition 1.   Use  fdisk /dev/vda  to open your disk in fdisk. (Use gdisk if you ar ...

  4. php单例模式深入讲解

    避免多次初始化数据库连接DAO 需要多次初始化数据库连接的场景 场景1: 首先PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的 一个类A需要调用多个类 ...

  5. 设为首页 收藏(IE可用)

    function SetHome(obj, vrl) { try { obj.style.behavior = 'url(#default#homepage)'; obj.setHomePage(vr ...

  6. MTK Android 默认值修改笔记

    1.设置菜单: 1.1位置信息(Location)默认关闭: 请将 alps\frameworks\base\packages\SettingsProvider\res\values\default. ...

  7. Android WebView支持WebGL

    Android从5.0开始默认支持WebGL,我在实际开发中遇到了一些5.0设备不支持的情况,原来Chromium对运行GPUs不稳定的或者有兼容性问题的设备会禁用WebGL.在Android平台可以 ...

  8. WPFPath素材

    放在Viewbox中可固定比例 <!--五角星--> <Canvas Width="100" Height="100"> <Pat ...

  9. zepto源码研究 - ajax.js(请求过程中的各个事件分析)

    简要:ajax请求具有能够触发各类事件的功能,包括:触发全局事件,请求发送前事件,请求开始事件,请求结束事件等等,贯穿整个ajax请求过程,这是非常有用的,我们可以利用这些事件来做一些非常有意思的事情 ...

  10. C++中getline函数的使用

    代码: #include <iostream> #include <cstdio> using namespace std; int main(){ char* s; s = ...