最短路径

数据结构-图的最短路径之Djikstra算法(迪杰斯特拉算法)

三世轮回 提交于 2020-02-28 21:58:09
一. Djikstra算法定义 形式: 用来解决单源最短路径的问题,即给出图G和起点s,通过算法到达每个顶点的最短距离。 基本思想: 对图G(V, E)设置集合S, 存放已被访问的顶点,然后每次从集合V-S中选择与起点s的最短距离最小的一个顶点u,访问并加入集合S。之后,令顶点u为中介点, 优化起点和所有的从u能到达的顶点v之间的最短距离。这样的操作执行n(顶点的个数)次。 伪代码: //G为图, 一般设置为全局变量,数组d为源点到达各点的最短路径长度,s为起点 Djikstra(G, d[], s){ 初始化 for(循环n次){ u = 是d[u]最小的还未被访问的顶点的标号 记u已被访问 for(从u出发能到达的所有顶点v){ if(v未被访问&&以U为中介使得s到顶点v的最短距离d[v]更优){ 优化d[v] } } } } 二、具体实现 1. 邻接矩阵版 const int MAXV = 1000;//最大顶点数 const int INF = 10000000000;//设INF为一个很大数 //适用于点数不大的情况 int n, G[MAXV][MAXV]; int d[MAXV]; bool vis[MAXV]; void Dijkstra(int s){ fill(d, d+MAXV, INF); d[s] = 0; for(int i = 0; i < n; i

广度优先遍历和深度优先遍历

荒凉一梦 提交于 2020-02-28 14:40:35
1.BFS   广度优先搜索一层一层地进行遍历,每层遍历都是以上一层遍历的结果作为起点,遍历一个距离能访问到的所有节点。需要注意的是,遍历过的节点不能再次被遍历。 如上图所示: 第一层:   0 -> {6,2,1,5} 第二层:   6 -> {4}   2 -> {}   1 -> {}   5 -> {3} 第三层:   4 -> {}   3 -> {}   每一层遍历的节点都与根节点距离相同。设 di 表示第 i 个节点与根节点的距离,推导出一个结论:对于先遍历的节点 i 与后遍历的节点 j,有 di <= dj。利用这个结论,可以求解最短路径等最优解问题:第一次遍历到目的节点,其所经过的路径为最短路径。应该注意的是,使用 BFS 只能求解无权图的最短路径,无权图是指从一个节点到另一个节点的代价都记为1。 在程序实现 BFS 时需要考虑以下问题: 1.队列:用来存储每一轮遍历得到的节点; 2.标记:对于遍历过的节点,应该将它标记,防止重复遍历。 2.DFS   广度优先搜索一层一层遍历,每一层得到的所有新节点,要用队列存储起来以备下一层遍历的时候再遍历。   而深度优先搜索在得到一个新节点时立即对新节点进行遍历:从节点 0 出发开始遍历,得到到新节点 6 时,立马对新节点 6 进行遍历,得到新节点 4;如此反复以这种方式遍历新节点,直到没有新节点了,此时返回。返回到根节点

程序员必须掌握的核心算法有哪些?

风流意气都作罢 提交于 2020-02-27 18:24:21
一、算法最最基础 1、时间复杂度 2、空间复杂度 一般最先接触的就是时间复杂度和空间复杂度的学习了,这两个概念以及如何计算,是必须学的,也是必须最先学的,主要有最大复杂度、平均复杂度等,直接通过博客搜索学习即可。 文章推荐: 算法分析神器—时间复杂度 二、基础数据结构 1、线性表 列表(必学) 链表(必学) 跳跃表(知道原理,应用,最后自己实现一遍) 并查集(建议结合刷题学习) 不用说,链表、列表必须,不过重点是链表。 三分钟基础数据结构:如何轻松手写链表? 以后有面试官问你「跳跃表」,你就把这篇文章扔给他 2、栈与队列 栈(必学) 队列(必学) 优先队列、堆(必学) 多级反馈队列(原理与应用) 特别是优先队列,再刷题的时候,还是经常用到的,队列与栈,是最基本的数据结构,必学。可以通过博客来学习。相关文章: 三分钟基础知识:什么是栈? 二叉堆是什么鬼? 【算法与数据结构】堆排序是什么鬼? 3、哈希表(必学) 碰撞解决方法:开放定址法、链地址法、再次哈希法、建立公共溢出区(必学) 布隆过滤器(原理与应用) 哈希表相关的,推荐通过博客来学习,推荐文章: Hash冲突之开放地址法 4、树 二叉树:各种遍历(递归与非递归)(必学) 哈夫曼树与编码(原理与应用) AVL树(必学) B 树与 B+ 树(原理与应用) 前缀树(原理与应用) 红黑树(原理与应用) 线段树(原理与应用)

PAT Advanced 1030 Travel Plan (30) [Dijkstra算法 + DFS,最短路径,边权]

試著忘記壹切 提交于 2020-02-27 16:25:24
题目 A traveler’s map gives the distances between cities along the highways, together with the cost of each highway. Now you are supposed to write a program to help a traveler to decide the shortest path between his/her starting city and the destination. If such a shortest path is not unique, you are supposed to output the one with the minimum cost, which is guaranteed to be unique. Input Specification: Each input file contains one test case. Each case starts with a line containing 4 positive integers N, M, S, and D, where N (<=500) is the number of cities (and hence the cities are numbered from

python 求迷宫最短路径

杀马特。学长 韩版系。学妹 提交于 2020-02-26 19:14:27
##输入n行m列的矩阵,1为可通行,0为障碍,求左上角到右下角的最短路径 ###输入 6 5 1 1 0 1 1 1 0 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 ###输出 9 import queue pic = [] dis = [] visited = [] nx = [[1, 0], [-1, 0], [0, -1], [0, 1]] class Node(): def __init__(self, x, y): self.x = x self.y = y def bfs(): dis[0][0] = 0 q = queue.Queue() node = Node(0,0) q.put(node) while q.qsize(): point = q.get() if point.x == n-1 and point.y == m-1: break for i in range(4): dx = point.x + nx[i][0] dy = point.y + nx[i][1] if (0 <= dx < n and 0 <= dy < m and pic[dx][dy] == 1): newPoint = Node(dx, dy) q.put(newPoint) dis[dx][dy] = dis[point.x]

PAT Advanced 1018 Public Bike Management (30) [Dijkstra算法 + DFS]

落爺英雄遲暮 提交于 2020-02-26 15:41:51
题目 There is a public bike service in Hangzhou City which provides great convenience to the tourists from all over the world. One may rent a bike at any station and return it to any other stations in the city. The Public Bike Management Center (PBMC) keeps monitoring the real-time capacity of all the stations. A station is said to be in perfect condition if it is exactly half-full. If a station is full or empty, PBMC will collect or send bikes to adjust the condition of that station to perfect. And more, all the stations on the way will be adjusted as well. When a problem station is reported,

Dijkstra求最短路径

删除回忆录丶 提交于 2020-02-24 12:51:59
Dijkstra求最短路径 问题: 给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值。 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1。 朴素 Dijkstra算法: Example 输入格式 第一行包含整数n和m。 接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。 输出格式 输出一个整数,表示1号点到n号点的最短距离。 如果路径不存在,则输出-1。 数据范围 1≤n≤5001≤n≤500, 1≤m≤1051≤m≤105, 图中涉及边长均不超过10000。 输入样例: 3 3 1 2 2 2 3 1 1 3 4 输出样例: 3 #include <cstring> #include <iostream> #include <algorithm> using namespace std; //使用邻接矩阵来写 const int N = 510; int n, m; int g[N][N]; int dist[N];//dist[N]狄杰斯特拉的距离,表示从1号点到其他点的最短距离是多少。 bool st[N];//st[]每个点最短路是否确定 int dijkstra() { memset(dist, 0x3f, sizeof dist);// 初始化 dist[1] = 0;//1

单源最短路径(Dijkstra算法)

余生长醉 提交于 2020-02-19 12:21:59
上一篇笔记记录了另一个单源最短路径算法 Bellman-Ford 算法,本篇的部分内容依赖上一篇笔记。最好先看上一篇。 单源最短路径(Bellman-Ford算法) Bellman-Ford 算法可以运行在带负权重的边上,因为存在负权重,所以记录节点的最短路径估值d不是递增的,最短路径树后面的节点的d可能比前面的节点还小,这就让我们必须在算法上多加考虑,所带来的时间复杂度就更高。而如果没有负权边,我们需要考虑的就少很多了。 放在前面 我们讨论单源最短路径时有这两个公共方法,具体说明在上一篇笔记中有提到。 INITIALIZE-SINGLE-SOURCE(G,s) for 图G中的每个节点 v v.d = ∞ v.PI = NIL s.d = 0 RELAX(u,v,w) if v.d > u.d + w(u,v) v.d = u.d + w(u,v) v.PI = u 下面看看Dijkstra算法是怎么解决问题的吧。 Dijkstra算法 DIJKSTRA(G,w,s) INITIALIZE-SINGLE-SOURCE(G,s) S = ∅ Q = G.v while Q != ∅ u = EXTRACT-MIN(Q) S = S ∪ {u} for v in G.Adj[u] RELAX(u,v,w) Dijkstra算法使用贪心策略

最短路径问题

那年仲夏 提交于 2020-02-18 22:16:13
图论中的经典问题:给一个图,求出起点到终点的最短路径。 Graph Representation adjacency matrix i/j 0 1 2 3 4 0 \(\infty\) -1 4 \(\infty\) \(\infty\) 1 \(\infty\) \(\infty\) 3 2 2 2 \(\infty\) \(\infty\) \(\infty\) \(\infty\) \(\infty\) 3 \(\infty\) 1 5 \(\infty\) \(\infty\) 4 \(\infty\) \(\infty\) \(\infty\) -3 \(\infty\) 用 vector<vector<int>> g(n, vector<int>(n, INF)) 表示, g[i][j] 表示从顶点 \(i\) 到顶点 \(j\) 的权重,空间复杂度 \(O(|V|^2)\) ,适用于稠密图,用的不多; adjacency list 链表比较少用,基本都用动态数组: 0 (1,-1) (2,4) - - - 1 (2,3) (3,2) (4,2) - - 2 - - - - - 3 (1,1) (2,5) - - - 4 (3,-3) - - - - 用 vector<vector<pair<int, int>>> g 表示, g[i][j].first 表示从顶点 \

hdu 1874 Dijkstra算法

天涯浪子 提交于 2020-02-17 11:25:10
先贴个网上找的比较通俗易懂的教程: 2.1 Dijkstra 算法(非负权,使用于有向图和无向图)   Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。 Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。  2.2 Dijkstra 算法思想 Dijkstra算法思想为:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将 加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。 2.3 Dijkstra 算法具体步骤   ( 1)初始时,S只包含源点,即S=,v的距离为0