首页 > 其他分享 >Floyd&Dijkstra

Floyd&Dijkstra

时间:2024-03-25 22:30:17浏览次数:18  
标签:pq int 算法 Dijkstra Floyd 短距离

拓展,多条路径Floyd算法

Floyd算法是一种求解“多源最短路”问题的算法

在Floyd算法中,图一般用邻接矩阵存储,边权可正可负(但不允许负环),利用动态规划的思想,逐步求解出任意两点之间的最短距离

我们需要准备的东西很少,只需要一个d数组:int[N][N][N],初始为无穷大,无穷大表示两点之间没有路径

d[k][i][j]表示路径(除去起点和终点)中编号最大的点编号≤k的情况下,点i到点j的最短距离

但是实际上k这一维度是可以优化掉的,所以直接用int d[N][N]

d[i][j]表示考虑到当前情况下,点i到点j的最短距离

这里3是中转点

//注意k作为中转点,必须放外层
for(int k=1;k<=n;k++)
  for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
      d[i][j]=min(d[i][j],d[i][k]+d[k][j]);

通过这段代码我们不难看出,Floyd算法的时间复杂度为O(n^3),是比较高的,所有一般只能处理n≤500的图论问题

这也是一个提示,当遇到n≤500的图论问题时,可以考虑Floyd算法

Dijkstra算法

Dijkstra算法是一种高效的处理非负边权的“单源最短路”问题的算法,例如求出所有点距离源点1的距离,可以说Dijkstra是最重要的图论算法之一

Dijkstra算法利用了贪心和动态规划的思想,也有多个版本:朴素版、堆优化版

这里直接讲解Dijkstra算法的堆优化版本(priority_queue优先队列实现,最常用、最高效),朴素版相比堆优化版没有任何优势

堆优化版本的时间复杂度为O(nlogn)

Dijkstra算法中,图采用邻接表的方式存储,比较适合稀疏图

算法需要准备的东西:

int d[N];

d[i]表示点i距离源点的最短距离

bitsetvis表示某个点是否走过(也可以用bool类型),按照Dijkstra的贪心思想,第一次走到的时候得到的距离一定是最短距离,所以一个点不可能走第二次

struct Node
{
  int x,w;//x表示点编号,w表示源点到x的最短距离
  bool operater<(const Node &u) const//重载比较函数
  {
    return w==u.w?x<u.x:w>u.w;//按照w降序,在优先队列中w最小的作为堆顶
  }
}

priority_queue<Node> pq;

void dijkstra(int st)//st为起点
{
  pq.push({st,d[st]=0});
  while(pq.size())//只要队列不为空
  {
    auto[x,w]=pq.top();pq.pop();//取出对头元素
    if(vis[x]) continue;//如果走过直接跳过
    vis[x]=true;//标记为走过
    for(const auto &[y,dw]:g[x])//x->y,边权为dw的边
    {
      if(d[x]+dw<d[y])//这一步十分关键
      {
        d[y]=d[x]+dw;
        pq.push({y,d[y]});//继续往外拓展
      }
    }
  }
}

 拓展,多条路径

标签:pq,int,算法,Dijkstra,Floyd,短距离
From: https://blog.csdn.net/2302_79085527/article/details/137028160

相关文章

  • Floyd 判圈算法
    概述  Floyd判圈算法又称作是龟兔赛跑算法,就是快慢指针的应用,主要用于判断并找到环形链表的入口。做法是设置两个指针,一个快指针(兔子),一个慢指针(乌龟),快指针一次移动两个节点,慢指针一次移动一个节点。如果有环存在,它们第一次会在环上相遇,这时快指针移动到出发点,转换成慢指针(就是......
  • lgB3647 Floyd最短路
    给出一张由n个点m条边组成的无向图,求所有点对(i,j)之间的最短路。n<=100;m<=4500;1<=w<=1000多源最短路模板题,注意循环顺序是kij,另外可能会有重边,因此两点之间的距离要初始化为inf,读入边权时取最小值。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong......
  • 1.基于搜索的路径规划:BFS、DFS、Dijkstra、A*、JPS
    1.概览可以对比不同算法的小动画 PathFinding.js(qiao.github.io)工作空间规划机器人有不同的形状和大小碰撞检测需要了解机器人的几何形状,耗时且难度大 我们希望将机器人表示为点,只需要把工作空间转换为配置空间C-obstacle,将原始的空间膨胀,这是一次性的C-space......
  • 最优乘车+最小花费(Dijkstra写法)
    题目描述H 城是一个旅游胜地,每年都有成千上万的人前来观光。为方便游客,巴士公司在各个旅游景点及宾馆,饭店等地都设置了巴士站并开通了一些单程巴士线路。每条单程巴士线路从某个巴士站出发,依次途经若干个巴士站,最终到达终点巴士站。一名旅客最近到 H 城旅游,他很想去 S......
  • 图Graph及相关算法(Dijkstra,Kruskal)
    目录无向图有向图邻接矩阵邻接表图的bfs,dfs二部图(二分图)有向无环图(DAG)拓扑排序(TopologicalSort)AOV网迪杰斯特拉Dijkstra最小生成树克鲁斯卡尔:Kruskal普里姆:prim图是多对多关系,是顶点和边的二元组和。无向图1.依附关系:边(v1,v2)依附于顶点v1,v2。2.完全图:所有......
  • 机器人路径规划:基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(提供Python代码)
    迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻......
  • Floyd算法学习笔记
    Floyd算法学习笔记前言如有错误,欢迎各位dalao批评指出。前置芝士:1.邻接矩阵(Floyd要用邻接矩阵存图)2.动态规划思想(最好学过,没学过也没有太大影响)1.Floyd所解决问题的类型我们可以发现,如Dijkstra,SPFA,BellmanFord一类的最短路算法都是解决单源点最短路问题,也就是确......
  • dijkstra算法详解
    今天给大家讲解\(dijkstra\)图论最短路算法在讲解\(dijkstra\)算法之前,先来给大家讲解一下图论中的松弛操作。松弛,即\(relaxtion\),是一种编程学术语。举例说明,例如我们可以从某个机场坐飞机达到若干个机场,然后从这些机场出发,我们又需做火车前往若干个城镇。现在假设我们手里......
  • 算法详解——Dijkstra算法
      Dijkstra算法的目的是寻找单起点最短路径,其策略是贪心加非负加权队列一、单起点最短路径问题  单起点最短路径问题:给定一个加权连通图中的特定起点,目标是找出从该起点到图中所有其他顶点的最短路径集合。需要明确的是,这里关心的不仅仅局限于寻找一条从起点出发到任......
  • 机器人路径规划:基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(提供Python代码)
    迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻......