我从许多资料中获悉,如果使用幼稚的方法来获取min元素(线性搜索),Dijkstra的最短路径也将以O(V ^

2)复杂度运行。但是,如果使用优先级队列,则可以将其优化为O(VLogV),因为此数据结构将在O(1)时间返回min元素,但是在删除min元素之后需要O(LogV)时间来恢复堆属性。

我已经在以下链接中针对UVA问题的以下代码中实现了Dijkstra的算法:https

:

//uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=16&page=show_problem&problem

=1927:

#include

#include

#include

#include

#include

using namespace std;

#define rep(a,b,c) for(int c=a;c

typedef std::vector VI;

typedef std::vector VVI;

struct cmp {

bool operator()(const pair &a,const pair &b) const {

return a.second < b.second;

}

};

void sp(VVI &graph,set,cmp> &minv,VI &ans,int S,int T) {

int e = -1;

minv.insert(pair(S,0));

rep(0,graph.size() && !minv.empty() && minv.begin()->first != T,s) {

e = minv.begin()->first;

minv.erase(minv.begin());

int nb = 0;

rep(0,graph[e].size(),d) {

nb = d;

if(graph[e][d] != INT_MAX && ans[e] + graph[e][d] < ans[d]) {

set,cmp>::iterator si = minv.find(pair(d,ans[d]));

if(si != minv.end())

minv.erase(*si);

ans[d] = ans[e] + graph[e][d];

minv.insert(pair(d,ans[d]));

}

}

}

}

int main(void) {

int cc = 0,N = 0,M = 0,S = -1,T = -1,A=-1,B=-1,W=-1;

VVI graph;

VI ans;

set,cmp> minv;

cin >> cc;

rep(0,cc,i) {

cin >> N >> M >> S >> T;

graph.clear();

ans.clear();

graph.assign(N,VI());

ans.assign(graph.size(),INT_MAX);

minv.clear();

rep(0,N,j) {

graph[j].assign(N,INT_MAX);

}

ans[S] = 0;

graph[S][S] = 0;

rep(0,M,j) {

cin >> A >> B >> W;

graph[A][B] = min(W,graph[A][B]);

graph[B][A] = min(W,graph[B][A]);

}

sp(graph,minv,ans,S,T);

cout << "Case #" << i + 1 << ": ";

if(ans[T] != INT_MAX)

cout << ans[T] << endl;

else

cout << "unreachable" << endl;

}

}

根据我的分析,我的算法具有O(VLogV)复杂度。STL std ::

set被实现为二进制搜索树。此外,该集合也被排序。因此,从中获取的最小元素为O(1),插入和删除的每个元素均为O(LogV)。但是,我仍然可以从这个问题中获得一个TLE,根据给定的时间限制,该问题应该可以在O(VLogV)中解决。

这使我思考得更深。如果所有节点都互连在一起,以使每个顶点V具有V-1邻居,该怎么办?因为每个顶点必须每个回合都查看V-1,V-2,V-3

…节点,这会使Dijkstra的算法在O(V ^ 2)中运行吗?

再三考虑,我可能会误解最坏情况下的复杂性。有人可以在以下问题上给我建议:

鉴于上述反例,Dijkstra的算法O(VLogV)的表现如何?

如何优化我的代码,使其达到O(VLogV)复杂度(或更高)?

编辑:

我意识到我的程序毕竟不能在O(ElogV)中运行。瓶颈是由我在O(V ^ 2)中运行的输入处理引起的。dijkstra部分确实在(ElogV)中运行。

迪杰斯特拉算法 php,Dijkstra算法的复杂度相关推荐

  1. 普利姆(prim)算法与迪杰斯特拉(dijestella)算法

    一:普利姆(prim)算法 对于临界矩阵表示的图,时间复杂度为O(|V|2) 对于邻接表表示的图,时间复杂度为O(|V|+|E|) 代码: int dist[];//用来记录从原点到各个节点的距离 b ...

  2. 最短路径算法(上)——迪杰斯特拉(Dijikstra)算法

    前记 对于迪杰斯特拉算法的分支界限法解法请移步:利用分支界限法求解Dijikstra算法 概述 单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径.在弄清楚如何求算单源最短路径问题之前,必 ...

  3. prim、迪杰斯特拉与卡鲁斯卡尔算法模板

    prim算法和迪杰斯特拉算法的区别主要是更新dist的方式不同,迪杰斯特拉算法更新距离时比较的是起始点到目标集合的最短距离,而prim算法更新的是未标记集合到已标记集合某点的最短距离. 迪杰斯特拉算法 ...

  4. 最短路径算法之迪杰斯特拉算法(Dijkstra)和佛洛依德算法(Floyd)

    今天学习了这两种算法,都是用来求最小路径的算法,但是迪杰斯特拉算法只能从某个特定点到所有点的最短路径,而佛洛依德算法可以查出任意点到任意点的最小路径. 迪杰斯特拉: package dijkstra; ...

  5. 迪杰斯特拉算法(Dijkstra‘s algorithm)以及示例

    迪杰斯特拉算法(Dijkstra's algorithm)是一种非常重要且有价值的算法.它被广泛应用于计算图中单源最短路径问题,在交通路线规划.网络路由.作业调度等领域有着广泛的应用. 迪杰斯特拉算法 ...

  6. floyd和迪杰斯特拉算法的路径记录方法。

    先说迪杰斯特拉,先看题目吧. 题目1 这题就是迪杰斯特拉的路径记录算法题啊,还记录了最小路径个数. 代码如下 #include<iostream> #include<cstdio&g ...

  7. 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)

    目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...

  8. 单源最短路径-Dijkstra(迪杰斯特拉算法)

    迪杰斯特拉算法时间复杂度为O(n^2),其中n为顶点个数. 该算法用于求单源最短路径.并且图中的边不允许带负权值. #include <iostream> using namespace ...

  9. 最短路径之迪杰斯特拉(Dijkstra 算法)弗洛伊德算法(C语言完整代码实现)

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  10. JavaScript实现dijkstra迪杰斯特拉算法(附完整源码)

    JavaScript实现dijkstra迪杰斯特拉算法 PriorityQueue完整源代码 MinHeap.js完整源代码 Heap.js完整源代码 Comparator.js完整源代码 dijks ...

最新文章

  1. SAP MTA打包的一些常见错误
  2. 【ArcGIS风暴】Win10操作系统ArcGIS许可License无法启动的解决方法汇总(绝对成功!)
  3. 如何进行有效的沟通----日常沟通及会议
  4. Linux vi 编辑器常见命令的使用
  5. 开发者测试android studio 试手
  6. python 干什么工作具有明显优势-python能做什么?有哪些优点?
  7. 学生成绩管理系统(Java)
  8. 希捷、西部数据硬盘保修查询
  9. 国仁猫哥:视频号超详细运营攻略教程;教你如何打造一个优质的视频号【建议收藏】
  10. Scikit-Learn机器学习(knn算法)
  11. 电烙铁焊锡到底有没有毒?
  12. Movie Database(电影数据库)
  13. 体育和旅游融合成为今夏显著的旅行趋势
  14. JAVA 网络编程中TCP和UDP
  15. Android 使用 ksoap2-android调用Web Service学习
  16. 计算机页面新建,电脑PS如何新建多个画布并使其显示在一个界面
  17. Redis 位图数据结构介绍
  18. oracle中exp中query,exp中query参数使用
  19. 基于Lucene shingle英文单词NGram Analyzer的实现
  20. 汉诺塔递归 C语言 代码简洁

热门文章

  1. Java技术分享:升级所安装Java版本的两种方式
  2. Linux监控FastCGI程序自启,Linuxx下fastcgi安装
  3. c# 解析gprmc数据_Windows下VLP16激光雷达数据解析
  4. 电脑雕刻教程_湖南益阳3DMAX建模培训入门教程【仁厚教育】
  5. cmd命令生成webservice_使用wsimport命令生成webService客户端代码实例
  6. pyqt5讲解9:时间模块timer和网页交互
  7. python天天向上的力量 B
  8. opengl加载显示3D模型ZAE类型文件
  9. JavaScript实现floatAsBinaryString浮点转为二进制字符串算法(附完整源码)
  10. OpenCASCADE绘制测试线束:数据交换命令之XDE 图层命令