Dijkstra算法使用于跑最短路的算法。

算法思想

  假定图是不带负权的有向图或无向图,采用贪心策略,每次扩展一个距离为最短的点,在以这个点为中间点,更新其他的所有点的距离。当所有边权都为正时,由于不会存在一个距离更短的没有扩展过的点,所以以这个点的距离永远不会再被更新,因而保证了算法的正确性。

算法流程

  • 初始化dist[1] = 0,其余的点时无穷大。
  • 找出一个未被标记的、dist[u]最小的节点u,然后标记节点u。
  • 扫描节点u的所有出边,若有dist[v] > dist[u] + w[i](v是到达的节点,w是边权),则使用dist[u] + w[i]更新dist[y]。
  • 重复上述的两个步骤直到所有点都被标记。

算法优化

  在上述算法过程我们可以在O(n*m)的时间内算出答案,主要问题在于找出节点u,我们可以利用堆对dist数组进行维护从而使获得最大值的时间从O(n)变为O(1),但是在维护过程中我们仍然需要O(log(n))的时间来维护。所以我们可在O(mlog(n))的时间内完成最短路。

  值得注意的是,在我们每次更新的时候,优先队列不支持更改操作,即我们每次更改dist实际上是加入了一个新的节点去维护dist,所以,我们在调取到之前的dist时要选择直接跳过,否则会直接TLE飞起来。

算法模板(洛谷P4779)

#include<bits/stdc++.h>
using namespace std;
int head[],ne[],to[],w[],edgenum=;
int dis[];
bool vis[];
int inf;
struct node{
int pos,val;
bool operator <(const node &a)const {return a.val<val;}
};
priority_queue<node> que;
inline void addedge(int f,int t,int co)
{
ne[++edgenum]=head[f];
head[f]=edgenum;
to[edgenum]=t;
w[edgenum]=co;
} inline int read()
{
int x = , w = ; char ch = getchar();
for(;!isdigit(ch);w |= (ch == '-'), ch = getchar());
for(;isdigit(ch);x = (x << ) + (x << ) + (ch ^ ), ch = getchar());
return w ? -x : x;
} inline node make_node(int x, int y)
{
node a;
a.pos = x, a.val = y;
return a;
} void Dijkstra(int s)
{
memset(dis,0x3f,sizeof(dis));
// inf = dis[0];
dis[s]=;
que.push(make_node(s, dis[s]));
while(!que.empty())
{
node x=que.top();que.pop();
int u = x.pos;
if(x.val > dis[u]) continue; //这一步就相当于是删除了那些不够优的节点
vis[u]=true;
for(int i=head[u];i;i=ne[i])
{
int v=to[i];
if(vis[v]) continue;
if(dis[v]>w[i]+dis[u])
{
dis[v]=w[i] + dis[u];
que.push(make_node(v, dis[v]));
}
}
}
}
int main()
{
int n = read(),m = read(),s = read(),x,y,l;
for(int i=;i<=m;i++)
{
//scanf("%d%d%d",&x,&y,&l);
x = read(), y = read(), l = read();
addedge(x,y,l);
}
Dijkstra(s);
for(int i=;i<=n;i++) printf("%d ",dis[i]);
printf("\n");
return ;
}

【模板】Dijkstra总结的更多相关文章

  1. 基础最短路(模板 dijkstra)

    Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多 ...

  2. 模板 Dijkstra+链式前向星+堆优化(非原创)

    我们首先来看一下什么是前向星.   前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的起始位置和 ...

  3. [模板] dijkstra (堆优化)

    复杂度O(mlogn) 输入起点s,可以得到从起点到各点的最短路距离数组dis[i] 过程: 1.初始化:清空标记数组,初始化距离数组设为inf,起点距离设为0,开优先队列,搜索起点 2.搜索:取出队 ...

  4. POJ 2387 Til the Cows Come Home(模板——Dijkstra算法)

    题目连接: http://poj.org/problem?id=2387 Description Bessie is out in the field and wants to get back to ...

  5. Dijkstra和Prim算法的区别

    Dijkstra和Prim算法的区别 1.先说说prim算法的思想: 众所周知,prim算法是一个最小生成树算法,它运用的是贪心原理(在这里不再证明),设置两个点集合,一个集合为要求的生成树的点集合A ...

  6. [笔记-图论]Dijkstra

    用于求正权有向图 上的 单源最短路 优化后时间复杂度O(mlogn) 模板 // Dijkstra // to get the minumum distance with no negtive way ...

  7. CSP-S需备模板大全

    CSP-S需备模板大全 谨以此文祝愿自己\(CSP-S\,\,2019\,\,\color{red}{RP++!!}\) 算法 二分 while(l<r) { int mid=(l+r+1)&g ...

  8. ACM模板合集

    写在前面: 第一年小白拿铜牌,第二年队友出走,加上疫情原因不能回校训练导致心底防线彻底崩盘,于是选择退役. 自从退役之后,一直想我打了那么久的ACM,什么也没留下觉得很难受,突然想到我打ACM的时候, ...

  9. 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板

    一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...

  10. Dijkstra 模板 最短路

    转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents ------------------------------------------ ...

随机推荐

  1. 获取服务器时间ajax

    $.ajax({ type:"OPTIONS", url:"/", complete:function(x){ // alert(x.getResponseHe ...

  2. RabbitMQ---8、连接断开处理-断线重连

    本文转载于:https://www.itsvse.com/thread-4636-1-1.html: 参考文献:http://www.likecs.com/show-29874.html:https: ...

  3. EF fluent API如何配置主键不自动增长

    在Dbcontext中作如下添加: protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilde ...

  4. 图解源码之FutureTask篇(AQS应用)

    所以,FutureTask既可以由Executor来调度执行,也可以由调度线程调用FutureTask.run()直接执行. FutureTask是通过AQS的模板设计模式来实现阻塞get方法的. 从 ...

  5. JSON 解析的可抛弃

    先看例子, json文件中有些元素不是我们想要的,在反序列化时可以当它们不存在,下面例子抛弃了 aaa.ccc这两节. package main import (     "encoding ...

  6. AJAX 概念 优势 发展前景 工作原理 底层技术 状态 缺点 框架

    1. 概念 Ajax asynchronous JavaScript and XML , 异步js和xml. 这种解释已经过时了, 现在ajax就是, 允许浏览器和服务器通信, 而无需刷新当前页面的技 ...

  7. Codeforces Round #417 C. Sagheer and Nubian Market

    C. Sagheer and Nubian Market time limit per test  2 seconds memory limit per test  256 megabytes   O ...

  8. 使用OmniGraffle创建流程图

    Mac下使用OmniGraffle创建是一个不错的选择 可以保存为OG格式,可以导出为VXD格式供visio使用

  9. .NET的那些事儿(9)——C# 2.0 中用iTextSharp制作PDF(基础篇) .

    该文主要介绍如何借助iTextSharp在C# 2.0中制作PDF文件,本文的架构大致按照iTextSharp的操作文档进行翻译,如果需要查看原文,请点击一下链接:http://itextsharp. ...

  10. 巧用花生壳将局域网内的FTP和www服务器发布到互联网

    一.目的:用生壳发布FTP和mail服务器到互连网. 二.网络环境:(出租房多家共用路由器上网,ADSL的1Mbps带宽,动态PPPOE拨号,帐号和密码存储在soho路由器中,路由器自动联机上网,并为 ...