Dijkstra算法:

Dijkstra是一种求解 非负权图 上单源最短路径的算法。

思路:将所有结点分为两个集合:已经确定最短路径的点(S)和未确定最短路长度的点集(T),开始时所有点都属于T

初始化dist[s]=0,其他点dis都为 +∞

然后重复操作:

  1. 在T集合中找到离源点最近的点u加入S
  2. 点u进行松弛操作(用u更新其他点的距离)(dis[j]=(dis[j]>dis[u]+w)?dis[u]+w:dis[j])
  3. 直到T集合未空 结束

    实现

    1.朴素做法O(n2)

    2.优先队列版O(mlogm)

朴素版Dijkstra

用的邻接矩阵存的图

遍历dist数组 找到没用确定最短路距离源点最近的点 u 用u更新其他点

int	g[N][N],dist[N];
bool st[N];
void dijkstra()
{
memset(dist,0x3f,sizeof d)//每个点先初始化为无穷远
for(int i=1;i<=n;i++)//遍历n个点
{
int u=0;
for(int j=1;j<=n;j++)//遍历dist数组 找到未确定最短路距离源点最近的点 u
{
if(!st[j]&&(u==0||d[j]<d[u]))
t=j;
}
//找到u
st[u]=true;
for(int i=1;i<=n;i++)//用u这个点更新其他点离源点的距离
{
dist[i]=min(dist[i],dist[u]+g[u][i]);
}
} }

时间复杂度:O(N2)

堆优化版Dijkstra

priority_queue<PII,vector,greater>heap;//小根堆

int e[N],ne[N],h[N],W[N],idx;
int dist[N];
booo st[N];
void add(int a,int b,int c)
{
w[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
} void Dijkstra()
{
memset(dist,0x3f,sizeof dist);
dist[1]=0;
priority_queue<PII,vector<PII>,greater<PII>>heap;//小根堆
heap.push({0,1});//距离 编号
while(heap.size())
{
auto u=heap.top();//未确定最短距离 离源点最近的点
heap.pop();
int distance=u.first,id=u.second;
if(st[id])continue;
st[id]=true;
for(int i=h[id];i!=-1;i=ne[i])
{
int j=e[i];
if(d[j]>distance+w[i])
{
d[j]=distance+w[i];
heap.push(d[j],j);
}
} } }
int main()
{
memset(h,-1,sizeof h);
cin>>n>>m;
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
} return 0;
}

时间复杂度:mlogm

最短路之Dijkstra的更多相关文章

  1. 最短路计数——Dijkstra

    题目: 给出一个N个顶点M条边的无向无权图,顶点编号为1−N.问从顶点1开始,到其他每个点的最短路有几条. ——传送门 受到题解的启发,用 Dijkstra A掉(手工代码) 思路: 1.无向无权图, ...

  2. UVA 11374 Airport Express 机场快线(单源最短路,dijkstra,变形)

    题意: 给一幅图,要从s点要到e点,图中有两种无向边分别在两个集合中,第一个集合是可以无限次使用的,第二个集合中的边只能挑1条.问如何使距离最短?输出路径,用了第二个集合中的哪条边,最短距离. 思路: ...

  3. poj 2449 Remmarguts' Date(第K短路问题 Dijkstra+A*)

    http://poj.org/problem?id=2449 Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Subm ...

  4. hdoj 2544 最短路【dijkstra or spfa】

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  5. 最短路和次短路问题,dijkstra算法

    /*  *题目大意:  *在一个有向图中,求从s到t两个点之间的最短路和比最短路长1的次短路的条数之和;  *  *算法思想:  *用A*求第K短路,目测会超时,直接在dijkstra算法上求次短路; ...

  6. BZOJ 3040: 最短路(road) [Dijkstra + pb_ds]

    3040: 最短路(road) Time Limit: 60 Sec  Memory Limit: 200 MBSubmit: 2476  Solved: 814[Submit][Status][Di ...

  7. HDu 2544 最短路【dijkstra &amp; floyed &amp; SPFA 】

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  8. hdu 2066 ( 最短路) Floyd & Dijkstra & Spfa

    http://acm.hdu.edu.cn/showproblem.php?pid=2066 今天复习了一下最短路和最小生成树,发现居然闹了个大笑话-----我居然一直写的是Floyd,但我自己一直以 ...

  9. poj 1797 最短路变形dijkstra

    题意:题目大意:有n个城市,m条道路,在每条道路上有一个承载量,现在要求从1到n城市最大承载量,而最大承载量就是从城市1到城市n所有通路上的最大承载量 链接:点我 解题思路:其实这个求最大边可以近似于 ...

  10. HDU 2544 最短路(Dijkstra)

    https://vjudge.net/problem/HDU-2544 题意: 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个 ...

随机推荐

  1. DotNetGuide荣登GitHub C#中文 Trending 月榜第一

    前言 发现最近有一大批应届生同学和Java转.NET的同学加入了我们的DotNetGuide技术社区交流6群(其他5个群都已满500人,6群也已有340多个小伙伴了)今天看到DotNetGuide荣登 ...

  2. 【VMware vSAN】vSAN Data Protection Part 1:安装部署。

    VMware vSAN 8 U3 中新引入了基于 vSAN ESA 的全新 vSAN Data Protection 功能,借助 vSAN Data Protection 功能,您可以使用在 vSAN ...

  3. aach64架构 ubuntu20 桌面版 编译安装ffmpeg难点总结

    [编译安装x264] 这一步基本上没有难点 git clone https://gitee.com/mirrors/x264.git ./configure --enable-shared --ena ...

  4. Simple WPF: WPF 实现按钮的长按,短按功能

    最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园. 实现了一个支持长短按得按钮组件,单击可以触发Click事件,长按可以触发LongPressed事件,长按松开时触发LongClick ...

  5. 【Redis】BigKey问题

    面试题 海量数据里查询某一固定前缀的key 生产上如何限制 keys * / flushdb / flushall 等危险命令以防止误删误用? MEMORY USAGE 命令用过吗? BigKey问题 ...

  6. Luogu P5745 区间最大和

    原题链接:Luogu P5745 区间最大和 初看这道题,

  7. Vscode 一次选中多行 光标一次定位多行

    1 . 鼠标点击开始位置(定位到行首时,鼠标就点击第一行的行首:定位到行尾时,鼠标就点击第一行的行尾:) 2.  按住shift+alt 点击结束的位置(定位到行首时,鼠标就点击最后一行的行首:定位到 ...

  8. let 和 const 是 JavaScript 中用于声明变量的关键字

    let 和 const 是 JavaScript 中用于声明变量的关键字. let 关键字用于声明可变(可重新赋值)的变量.通过使用 let 关键字声明的变量可以在其作用域内被重新赋值.例如: let ...

  9. Django 不通过外键实现多表关联查询

    Django不通过外键实现多表关联查询 by:授客 QQ:1033553122 测试环境 Win 10   Python 3.5.4   Django-2.0.13.tar.gz 需求 不通过外键,使 ...

  10. 【MySQL】MySQL 执行创建存储过程报错的解决方法

    源码 创建使用while循环插入数据的存储过程 设置mysql分隔符为// delimiter // drop procedure if exists while1 ; create procedur ...