dijkstra

2020/1/26单源最短路Dijkstra算法

会有一股神秘感。 提交于 2020-01-27 00:04:44
今日大年初二,期望武汉疫情早日控制!! 单源最短路 以PTA 7-35 城市间紧急救援 (25分)为例 题目 该题目要求给出从相应起点出发所得到的最短路,于是考虑单源最短路的Dijkstra算法。 Dijkstra算法 算法可以得到由指定起点出发到达其他结点的最短路径长度。 实现步骤: 初始化距离数组为INF 扫描邻接矩阵,加入起点,更新距离数组 外层有N-1层循环,每层循环找到距离最小且未被访问的结点,加入该结点,更新距离数组。 全部执行完之后,将可以得到一个长度为结点数目的数组,该数组存储了由结点到达其它结点的最短距离。另外,该题目还需要输出最短路径的条数以及路径,所以在更新距离数组时,需要将距离相同的路径条数以及经过的路径进行记录。 AC代码如下: # include <bits/stdc++.h> # include <cstdio> # include <cstdlib> # include <iostream> # include <algorithm> # include <string.h> # define ll long long # define INF 10000 # include <map> # include <stack> # include <queue> # include <stdio.h> # include <string.h> using

Dijkstra解决POJ 2263

◇◆丶佛笑我妖孽 提交于 2020-01-25 18:03:21
题目:http://poj.org/problem?id=2263 题目大意: 有n个城市,r条连接两个城市的道路,每条道路有自己的最大复载量。现在问从城市cst到城市cen,车上的最大载重能为多少。 虽然是提交了,也搞懂了,但是还没有彻底的明白。 因此,也不便多说什么,当我彻底明白的时候再说吧。 呵呵,终于完全的明白了,下面指出一二。 1.一定要明白map[][]的双关性,何为双关? (1).map[i][j]表示i到j的距离 (2).map[i][j]=0表示i到j不可以直接可达 要达到这种效果,首先将map[][]全部赋值为0, 然后存储建图,在建图的过程中自然的将直接可达 的两点赋值为不是0的值了。 2.一定要明白dis[]是干什么用的,是干什么用的呢? dis[i]是用来存储要求解的start点到i的最优解的。 一旦求出,将不会改动。当i=end的时候,也就是得到 答案的时候。 3.一定要明白visited[]是干什么用的,干什么用的?  当visited[i]=0,表示i点并没有加入到已经解出的 集合中,也就是说,下次循环的时候是要访问的对象。 当visited[i]=1,表示i点已经加入到了解出的集合 中,下次循环的时候,不能再次访问它了。 好了,就这些了,多了没有,不信你还是不懂! View Code #include "iostream" using

Returning name of lowest node

纵饮孤独 提交于 2020-01-25 06:42:22
问题 First of all, this is part of a university course, so whilst a copy-paste solution would do, I'm looking for a bit more depth. I'll be seeing my supervisor tomorrow anyways though. Now onto the problem. I am implementing Dijkstra's algorithm for 5 linked nodes, A-E, which have their associated costs and links stored in a vector; struct Node { char nodeLink; //adjacent link int cost; //cost of a link }; //to use in Dijkstra algorithm class HeadNode { public: char Name; bool Visited; vector

Dijkstra’s shortest path algorithm

别说谁变了你拦得住时间么 提交于 2020-01-24 04:56:06
问题 The following is algorithm summary given to us by our professor. What is the parent of a node in a graph as referred to in step 3? I'm a little confused as I though that the nodes only had neighbors and doesn't have a parent? My second question is about step 3, "pick up the index’th record in stack." Since a stack only allows you to view the top, I'm not sure what it means by picking up the index'th record? Dijkstra’s shortest path: Step 0: if s == d, stop. Step 1: current node c= s, c.length

dijkstra算法及其优化

不羁岁月 提交于 2020-01-22 20:02:52
dijkstra算法是经典的贪心算法。基本的想法是,有两个集合S和E,开始S集合中只有一个起点,E集合中有剩下的其他点。遍历E集合中的所有点,找出与起点距离最近的一个点,将其加入集合S,并用该点去更新起点到其他点的最短路径。 由动图结合上面的思路,我们可以看出,算法的基本框架是: 1 1.初始化 2 for i(0 -> n - 1) 3 { 4 2.找出距离起点最近的点 5 3.标记该点加入集合S 6 4.用新加入集合S的点去更新起点到其他点的最短距离 7 } 1.其中初始化包括了距离数组dis,将dis数组初始化为无穷大,将第一个点的距离置为0。 2.循环n - 1次是因为n个点只需添加n - 1个点到集合S,每做一次循环添加一个点,所以是循环n - 1次。 3.标记新点加入集合用一个st数组记录即可。 4.dis[i]表示的是起点s到i的点距离,所以用新点a去更新起点s到其他点(例如b点)的最短路径就是比较dis[a] + (a到b的距离)和 dis[b]的大小,将dis[b]置成两者中的最小值。 5.可以注意的是在伪代码中的2步:找出距离起点最近的点,要遍历剩下的所有点,所以时间复杂度是O(n),但是我们联想到,在一堆数字中找出一个最小值,可以用堆进行优化,时间复杂度是可以由O(n)降到O(logn)的。所以这就是dijkstra的堆优化,可以将时间复杂度为O(mn)降为O

dijkstra扩展应用

喜夏-厌秋 提交于 2020-01-22 18:58:45
1.图中点与路均有权值,且存在多条最短路,要求输出最短路条数、点权和最小的最短路路径及其点权和。 1)如何求最短路数量? 数据结构:开一个count[]数组,记录到某点的最短路条数。 代码:在dij算法中的“更新各点最短路d[i]”的部分,除了判断体①d[u]>d[v]+cost[v][u],还要新增判断体②d[u]==d[v]+cost[v][u];在前者,更新count[u]=count[v],在后者更新count[u]+=count[v]. 初始化:count[s]=0,其余为0 2)如何找到最短路中的最大点权和? 数据结构:开sum[]数组记录到点i的最短路径中点权和最大的路径的点权和(好绕= =)。开val[]存每个点的和,这个是固定的。 代码:在判断体①中,写sum[u]=sum[v]+val[u];在②中,if(sum[u]<sum[v]+val[u]),更新sum[u]=sum[v]+val[u]; 初始化:sum[s]=val[s];其余为0 3)如何将2)中的那条路记录下来? path[]数组反向记录即可.即path[i]=j表示点i的最短路是由j点转来的.如果正向,由于一个点可能通向多个点,且均为到这些点的最短路,那么会产生覆盖. 天梯赛 L2-001 紧急救援 ac代码 public class Main { static int INF =

pta—紧急救援 (dijkstra)

时光毁灭记忆、已成空白 提交于 2020-01-22 02:21:29
pta—紧急救援 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。 输入格式: 输入第一行给出4个正整数N、M、S、D,其中N(2<=N<=500)是城市的个数,顺便假设城市的编号为0~(N-1);M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。第二行给出N个正整数,其中第i个数是第i个城市的救援队的数目,数字间以空格分隔。随后的M行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。 输出格式: 第一行输出不同的最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到D的路径中经过的城市编号。数字间以空格分隔,输出首尾不能有多余空格。 输入样例: 4 5 0 3 20 30 40 10 0 1 1 1 3 2 0 3 3 0 2 2 2 3 2 输出样例: 2 60 0 1 3 题解:dijkstra计算最短路的长度,结果保存在数组d中,数组path记录最短路的条数。 利用前缀数组pre记录最短路的路径,利用栈输出;

Dijkstra's algorithm with back tracking?

感情迁移 提交于 2020-01-21 09:14:49
问题 In a related thread, it was suggested that I impliment Dijkstra's algorithm for finding the shortest path on a graph. Looking at this .gif of the algorithm from wikipedia: What if the path 1,3,6,5 turned out to be very low cost? For example, the weight on 3-6 was 1, and the weight on 6-5 was 2? Dijkstra's algorithm would not consider this path because it only looks one step ahead; it skipped node 3. Is it acceptable to specify a parameter that makes the algorithm look 2,3,4...n steps ahead

最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)

巧了我就是萌 提交于 2020-01-21 04:46:19
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。 Dijkstra算法 能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。 Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。 其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。 初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其它顶点之间的最短路径长度。 例如,对下图中的有向图,应用 Dijkstra算法 计算从源顶点1到其它顶点间最短路径的过程列在下表中。 Dijkstra算法的迭代过程: 以下是具体的实现(C/C++): #include <iostream> #include<stdio.h> #include<stdlib.h> using namespace std; const int

最短路(Dijkstra,Floyd,Bellman_Ford,SPFA)

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-20 21:45:05
当然,这篇文章是借鉴大佬的。。。 最短路算法大约来说就是有4种——Dijkstra,Floyd,Bellman_Ford,SPFA 接下来,就可以一一看一下。。。 1. Dijkstra (权值非负,适用于有向图及无向图,单源最短路) 1 Dijkstra's算法解决的是图中单个源点到其它顶点的最短路径。只能解决权值非负(看了代码就知道了) 2 Dijkstral只能求出任意点到达源点的最短距离(不能求出任意两点之间的最短距离),同时适用于有向图和无向图,复杂度为O(n^2). 3算法的过程: 1设置顶点集合S并不断的作贪心选择来选择扩充这个集合。一个顶点属于集合S当且仅当从源点到该点的最短路径长度已知 2 初始时,S中仅含有源。设U是G的某一个顶点,把从源到U且中间只经过S中的顶点的路称为从源到U的特殊路径,并用dis数组距离当前每一个顶点所对应的最短特殊路径 3Dijkstra算法每一次从V-S中取出具有最短特殊长度的顶点u,将u添加到S中,同时对dis数组进行修改。一旦S包含了所有的V中的顶点,dis数组就记录了从源点到其它顶点的最短路径长度。 4 模板: 没有优化,时间复杂度o(n^2) 1 #define MAXN 1010 2 #define INF 0xFFFFFFF 3 int value[MAXN][MAXN];/*保存的是边权值*/ 4 int dis[MAXN