原理

Dijkstra是一个神奇的最短路径算法,它的优点在于它可以稳定的时间内求出一张图从某点到另一点的距离。它的工作原理非常简单,思路类似于广搜。在搜索前,将每个点的颜色设为白色,第一次将源点Insert进入集合,将源点的最短路(用Dis数组表示)设为0,然后在它的所有白色孩子边上进行一遍搜索,并将经过的点的颜色设为黑色。在搜到更优的距离后对Dis进行适当的更新,让Disi每次都表示到点i的最短距离。搜到汇点时停止。此时,DisT表示的就是到达T的最短路径。

代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <utility> #define debug(x) std::cout << #x << " = " << x << std::endl struct
{
int to, nex, v;
} e[100001];
int head[100001] = { 0 }, dis[100001] = { 0 };
bool b[100001] = { false }; void Insert(const int x, const int y, const int w)
{
static int tot = 0;
tot++;
e[tot].nex = head[x];
e[tot].to = y;
e[tot].v = w;
head[x] = tot;
} int n, m, S, T; void Dijkstra()
{
typedef std::pair<int, int> pii;
std::priority_queue<pii, std::vector<pii>, std::greater<pii> > q;
int now, j;
std::memset(dis, 0x7f, sizeof dis);
q.push(std::make_pair(0, S));
while (!q.empty())
{
now = q.top().first;
j = q.top().second;
q.pop();
if (b[j])
continue;
b[j] = true;
dis[j] = now;
for (int t = head[j]; t; t = e[t].nex)
if (dis[e[t].to] > now + e[t].v)
q.push(std::make_pair(now + e[t].v, e[t].to));
}
} int main(int argc, char ** argv)
{
while (~std::scanf("%d%d", &n, &m))
{
std::memset(dis, 0, sizeof dis);
for (size_t i = 0; i < m; i++)
{
int x, y, w;
std::cin >> x >> y >> w;
Insert(x, y, w);
}
S = 1, T = n;
Dijkstra();
std::cout << dis[T] << std::endl;
}
return 0;
}

图论算法-Dijkstra的更多相关文章

  1. 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径

    自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...

  2. 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)

    一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...

  3. 有向有权图的最短路径算法--Dijkstra算法

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

  4. 【WIP_S9】图论算法

    创建: 2018/06/01 图的概念 有向边 有向图 无向边 无向图 点的次数: 点连接的边的数量 闭路: 起点和重点一样 连接图: 任意两点之间都可到达 无闭路有向图: 没有闭路的有向图 森林: ...

  5. 图论-最短路径<Dijkstra,Floyd>

    昨天: 图论-概念与记录图的方法 以上是昨天的Blog,有需要者请先阅读完以上再阅读今天的Blog. 可能今天的有点乱,好好理理,认真看完相信你会懂得 分割线 第二天 引子:昨天我们简单讲了讲图的概念 ...

  6. NOIp 图论算法专题总结 (1):最短路、最小生成树、最近公共祖先

    系列索引: NOIp 图论算法专题总结 (1) NOIp 图论算法专题总结 (2) NOIp 图论算法专题总结 (3) 最短路 Floyd 基本思路:枚举所有点与点的中点,如果从中点走最短,更新两点间 ...

  7. NOIp 图论算法专题总结 (3):网络流 & 二分图 简明讲义

    系列索引: NOIp 图论算法专题总结 (1) NOIp 图论算法专题总结 (2) NOIp 图论算法专题总结 (3) 网络流 概念 1 容量网络(capacity network)是一个有向图,图的 ...

  8. 最短路径算法Dijkstra和A*

    在设计基于地图的游戏,特别是isometric斜45度视角游戏时,几乎必须要用到最短路径算法.Dijkstra算法是寻找当前最优路径(距离原点最近),如果遇到更短的路径,则修改路径(边松弛). Ast ...

  9. 最短路径算法——Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson

    根据DSqiu的blog整理出来 :http://dsqiu.iteye.com/blog/1689163 PS:模板是自己写的,如有错误欢迎指出~ 本文内容框架: §1 Dijkstra算法 §2 ...

随机推荐

  1. CSS学习之选择器

    html是盖房子,css是将房子装扮的更漂亮一些!CSS(Cascading Style Sheets),值层叠样式表. 语法 选择器 { 属性 : 属性值 ; } 比如, p{color:red;} ...

  2. Linux shell-tail

    使用tail --help查看命令用于备忘 tail [  -f ] [  -c Number |  -n Number |  -m Number |  -b Number |  -k Number ...

  3. Myeclipse Java项目转换成Maven项目

    1.在Eclipse中Java项目转换成Maven项目可以在项目右键-->configure-->Convert Plug-in projects..  就可以.而在myeclipse中项 ...

  4. Jquery EasyUI远程校验,Jquery EasyUI多个自定义校验,EasyUI自定义校验

    >>>>>>>>>>>>>>>>>>>>>>>>> ...

  5. laravel 框架memcache的配置

    Laravel5框架在Cache和Session中不支持Memcache,看清了是Memcache而不是Memcached哦,MemCached是支持的但是这个扩展真的是装的蛋疼,只有修改部分源码让其 ...

  6. 一张图解析nvm,npm,nodejs之间的关系

  7. POPTEST 150801 祝大家前途似锦

    POPTEST 150801 祝大家前途似锦   PT20150801学员不断在就业,同学们走好,远兵辛苦了!!!

  8. H5与Android之间的交互

    关于Android与JS网页端的交互,网上有很多教程,刚做这功能,参考了多方资料,最终出来后觉得简单,但是为实现的话有诸多小问题,最终效果如下: 现在简单整理一下:(直接贴代码,注释详细,应该能懂的) ...

  9. 玩转 SSH(七):使用 dubbo + zookeeper 实现服务模块化

    一.创建 SSMVCAnnoDemo 项目 点击菜单,选择“File -> New Project” 创建新项目.选择使用 archetype 中的 maven-quickstart 模版创建. ...

  10. Python os与sys模块解析

    os与sys模块的官方解释如下: os: This module provides a portable way of using operating system dependent functio ...