用于求正权有向图 上的 单源最短路

优化后时间复杂度O(mlogn)

模板

// Dijkstra
// to get the minumum distance with no negtive ways
//
// Description:
// 1. get vertex with minumum distance
// 2. do relax
//
// Details:
// 1. use priority_queue and pair<dis, verIdx>
// 2. use dis[verIdx] as minumum marks (pair.dis=dis[pair.verIdx]?)
// 3. initialize edge, G, dis and que typedef pair<int, int> Node; // dist, VerIdx
const int maxn=205, maxm=maxn*maxn, INF=0x3f3f3f3f;
struct Edge{
int from, to, dist;
Edge(int from=0, int to=0, int dist=0):
from(from),to(to),dist(dist) {}
};
vector<Edge> edge;
vector<int> G[maxn+5];
void AddEdge(int from, int to, int val){
edge.push_back(Edge(i, j, val);
G[i].push_back(edge.size()-1);
edge.push_back(Edge(j, i, val));
G[j].push_back(edge.size()-1);
} int Dijkstra(int st, int tar){
memset(dist, INF, sizeof(dist));
priority_queue<Node, vector<Node>, greater<Node> > que;
que.push(Node(0, st));
memset(dist, -1, sizeof(dist)); dist[st]=0;
while (que.size()){
Node x=que.top(); que.pop();
if (x.first!=dist[x.second]) continue;
// vertax minized int &from=x.second;
for (int i=0; i<G[from].size(); i++){
Edge &e=edge[G[from][i]];
int &to=e.to;
if (dist[to]<=dist[from]+e.dis) continue;
dist[to]=dis+e.dis;
que.push(Node(dist[to], to));
}
}return dist[tar];
}

注意

  1. 需要初始化dist为INF;edge, G为空
  2. 注意优先队列的优先大小,用greater 使dist小的作为队头
  3. 考虑dist[k]==INF,为不存在路径

例题

二进制状态,隐式图搜索

UVA-658 It's not a Bug, it's a Feature!

模板题

POJ-1502 MPI Maelstrom

[笔记-图论]Dijkstra的更多相关文章

  1. Cocos2d-x 地图步行实现1:图论Dijkstra算法

    下一节<Cocos2d-x 地图行走的实现2:SPFA算法>: http://blog.csdn.net/stevenkylelee/article/details/38440663 本文 ...

  2. 图论——Dijkstra算法

    图论其实是比较难的一种题型,但是一些模板题,是没有什么太大难度的! 这里给大家带来的是迪杰斯特拉(Dijkstra)算法. 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄 ...

  3. Light OJ 1019 - Brush (V)(图论-dijkstra)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1019 题目大意:Tanvir想从节点1的位置走到节点n的位置, 输出最短距离, ...

  4. [图论]Dijkstra 算法小结

    Dijkstra 算法小结  By Wine93 2013.11 1. Dijkstra 算法相关介绍 算法阐述:Dijkstra是解决单源最短路径的算法,它可以在O(n^2)内计算出源点(s)到图中 ...

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

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

  6. 图论——Dijkstra+prim算法涉及到的优先队列(二叉堆)

    [0]README 0.1)为什么有这篇文章?因为 Dijkstra算法的优先队列实现 涉及到了一种新的数据结构,即优先队列(二叉堆)的操作需要更改以适应这种新的数据结构,我们暂且吧它定义为Dista ...

  7. 图论·Dijkstra·HDU2066

    这道题刚做的时候用的Floyd,果断超时,于是去学了Dijkstra,主函数和Floyd很像. 原理: 从起点开始,找最近的又未标记的点,记录距离,标记此点,再找此点附近相连的未标记的点,记录下距离, ...

  8. 图论--Dijkstra算法总结

    Key word: ①BFS转换Dijkstra ②其他关系转化为最短路 ③反向建边及反向Dijkstra ④稠密图.稀疏图 ⑤链式前向星 ⑥Vector建图 ⑦超级源点&汇点 详解: 1.B ...

  9. 【uva 658】It's not a Bug, it's a Feature!(图论--Dijkstra或spfa算法+二进制表示+类“隐式图搜索”)

    题意:有N个潜在的bug和m个补丁,每个补丁用长为N的字符串表示.首先输入bug数目以及补丁数目.然后就是对M个补丁的描述,共有M行.每行首先是一个整数,表明打该补丁所需要的时间.然后是两个字符串,第 ...

随机推荐

  1. 简单的floyd——初学

     前言: (摘自https://www.cnblogs.com/aininot260/p/9388103.html): 在最短路问题中,如果我们面对的是稠密图(十分稠密的那种,比如说全连接图),计算多 ...

  2. BZOJ 2096 单调队列

    思路: 偷懒用的STL //By SiriusRen #include <deque> #include <cstdio> using namespace std; struc ...

  3. C#的常见算法(面试)(转)

    一.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m //方法一,通过顺序规律写程序,同时也知道flag标志位的重要性. static int F1(int m) { ; ...

  4. webkit Safari的样式库

    1,webkit Box模型 CSS定义:-webkit-border-bottom-left-radius: radius; CSS定义:-webkit-border-top-left-radius ...

  5. 洛谷P1231 教辅的组成 网络流

    Code: #include<cstdio> #include<cstring> #include<algorithm> #include<vector> ...

  6. web移动端-弹性盒模型

    (父元素加) : /*新版弹性盒模型*/ /* display: flex; */ /*设置主轴方向为水平方向*/ /* flex-direction: row; */ /*设置主轴方向为垂直方向*/ ...

  7. FastDFS图片服务器搭建

    *FastDFS图片服务器搭建准备:1.需要libfastcommon安装包 选择最新稳定版(libfastcommon-1.0.36.tar.gz)2.需要FastDFS安装包 选择最新稳定版(fa ...

  8. suse 11 sp4 bond 网卡 mode0模式

    开启网卡: ifocnfig eth1 up 点亮网卡ethtool eth1 db2:~ # cat /etc/sysconfig/network/ifcfg-bond0 DEVICE='bond0 ...

  9. MySQL 数据还原

    1.1还原使用mysqldump命令备份的数据库的语法如下: mysql -u root -p [dbname] < backup.sq 示例: mysql -u root -p < C: ...

  10. 超简单入门Vuex小示例

    写在前面 本文旨在通过一个简单的例子,练习vuex的几个常用方法,使初学者以最快的速度跑起来一个vue + vuex的示例. 学习vuex需要你知道vue的一些基础知识和用法.相信点开本文的同学都具备 ...