最短路径

Dijkstra算法详细(单源最短路径算法)

不打扰是莪最后的温柔 提交于 2019-11-29 22:30:04
介绍 对于 dijkstra 算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解 bfs和dfs ,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或许,你曾经感觉它很难,那么,这个时候正适合你重新认识它。 Dijkstra能是干啥的? Dijkstra是用来求单源最短路径的 就拿上图来说,假如直到的路径和长度已知,那么可以使用 dijkstra 算法计算 南京到图中所有节点的最短距离。 单源 什么意思? 从一个顶点出发,Dijkstra算法只能求一个顶点到其他点的最短距离而不能任意两点。 和 bfs 求的最短路径有什么区别? bfs 求的与其说是路径,不如说是 次数 。因为bfs他是按照队列一次一次进行加入相邻的点,而两点之间没有权值或者权值相等(代价相同)。处理的更多是偏向迷宫类的这种都是只能走邻居(不排除特例)。 Dijkstra在处理具体实例的应用还是很多的,因为具体的问题其实带权更多一些。 比如一个城市有多个乡镇,乡镇可能有道路,也可能没有,整个乡镇联通,如果想计算每个乡镇到a镇的最短路径,那么Dijkstra就派上了用场。 算法分析 对于一个算法,首先要理解它的 运行流程 。 对于一个Dijkstra算法而言,前提是它的前提条件和环境: 一个连通图,若干节点,节点可能有数值,但是 路径 一定有 权值 。并且路径

HDU1595-find the longest of the shortest-dijkstra+记录路径

独自空忆成欢 提交于 2019-11-29 14:12:50
Marica is very angry with Mirko because he found a new girlfriend and she seeks revenge.Since she doesn't live in the same city, she started preparing for the long journey.We know for every road how many minutes it takes to come from one city to another. Mirko overheard in the car that one of the roads is under repairs, and that it is blocked, but didn't konw exactly which road. It is possible to come from Marica's city to Mirko's no matter which road is closed. Marica will travel only by non-blocked roads, and she will travel by shortest route. Mirko wants to know how long will it take for

P3371 【模板】单源最短路径(弱化版)

可紊 提交于 2019-11-29 08:19:20
P3371 【模板】单源最短路径(弱化版) 此题使用 【堆优化Dijkstra求最短路模版】 AC代码 # include <iostream> # include <cstdio> # include <queue> # include <utility> # include <algorithm> # include <vector> # define MAXN 100010 //最大顶点数 # define inf 2147483647 //极大数据 using namespace std ; typedef pair < int , int > info ; //存放当前点及从源点到当前点的最短路径的信息 priority_queue < info , vector < info > , greater < info > > Q ; //优先队列实现将已确定最短路径的点放入队列 小顶堆实现堆优化 struct edge { int to ; //弧指向的点 int weight ; //弧的权重 edge ( int t , int w ) : to ( t ) , weight ( w ) { } } ; vector < edge > G [ MAXN ] ; //存放当前点出发的每一条弧的信息 int n , m , s ; //点 弧 源点 int dis [

P2993 [FJOI2014]最短路径树问题

雨燕双飞 提交于 2019-11-29 01:37:45
思路:最短路+点分治 提交:2次 错因:更新桶的时候没有重置,而直接加上了。 题解: 对于构建最短路树,我们可以先跑最短路,然后dfs一遍连边。 然后就是点分治了,还是一些桶,存点数为 \(x\) 的最长路径的条数。记得更新路径长度时桶要清零。 代码 #include<cstdio> #include<iostream> #include<cstring> #include<queue> #include<algorithm> #define R register int using namespace std; namespace Luitaryi { template<class I> inline I g(I& x) { x=0; register I f=1; register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f; do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*=f; } const int N=30010,M=60010,Inf=0x3f3f3f3f; int n,m,K,rt,tot,cnt,size,sum,ans=-1,C; bool vis[N]; int vr[N<<1],nxt[N<<1],fir[N],w[N<<1]

浙大 PAT 甲级 1072 Gas Station Dijkstra算法 单源最短路径

拈花ヽ惹草 提交于 2019-11-29 00:48:05
这题比较难,考察最短路径,加了很多复杂的条件。 第一步,读懂题意 首先题意需要读懂,候选加油站需要满足以下条件: 1、加油站离每个住宅的最短距离要在服务范围内; 2、针对每个候选加油站,求出这个加油站到每个住宅的最短距离,这些最短距离中最小的那一个值,也就是离整个住宅区的最短距离,越大越好; 3、如果有多个这样的候选加油站,那么针对每个候选加油站,求这个加油站到每个住宅的最短距离的和,最短距离和越小越好; 4、如果有多个这样的候选加油站,那么加油站的编号越小越好。 因此,解题思路是: 1、输入数据; 2、用Floyd算法求出两点之间的最短距离; 3、逐个判断哪个加油站是有效最优解; 4、按要求输出结果。 第二步,处理输入 输入有字符有数字,并且还有干扰输出,比如: 1、同一个起点和终点间有两条路,这时候只保存最短的那条; 2、起点和终点是同一个位置,忽略; 3、用字符数组接收编号,如果开头是G,那么为加油站,将它转换成数字N+i(N是住宅的总数,i是该加油站的数字编号)。 第三步,选择算法 大致有两种算法: 1、将问题看作全源最短路径,用Floyd算法求得每两点间的最短距离,从而找出最佳候选位置。 Floyd算法的时间复杂度大约是三次方,最后一个用例会超时。 2、改变思路,将问题看作单源最短路径,针对每个加油站都做一次单源最短路径,用Dijkstra算法,时间复杂度大约是二次方

第二周星期五

懵懂的女人 提交于 2019-11-29 00:45:47
1.涉嫌dijkstra算法:设置一个集合S存放已经找到最短路径的顶点,S的初始状态只包含源点v,对vi∈V-S,假设从源点v到vi的有向边为最短路径。以后每求得一条最短路径v, …, vk,就将vk加入集合S中,并将路径v, …, vk , vi与原来的假设相比较,取路径长度较小者为最短路径。重复上述过程,直到集合V中全部顶点加入到集合S中。声明一个数组distance来保存源点到各个顶点的最短距离和一个已经找到最短路径的顶点的队列visited,以及一个用于存储具体路线的HashMap集合path; 一个类的写法 public void dijkstra(int[][] weight,Object[] str,int v) { HashMap path; path=new HashMap(); for(int i=0;i<str.length;i++) path.put(i, ""); //初始化路径长度数组distance for(int i=0;i<str.length;i++) { path.put(i, path.get(i)+""+str[v]); if(i==v) distance[i]=0; else if(weight[v][i]!=-1) { distance[i]=weight[v][i]; path.put(i, path.get(i)+"-->"+str

搜索:最优,分支界限

本秂侑毒 提交于 2019-11-28 19:21:29
  在接下来这篇博客中,我们将介绍如何获得从S到G的最短路径. 1.搜索树   我们可以以树的形式画出所有可能的路径:   但是这种方法需要遍历所有的路径,效率非常低.   深度优先搜索   在S,面临的选择是A或B,按照惯例,我们总是往左走,也就是从S去A,然后到达,B,C,E,到达了死胡同之后,我们需要进行回溯,到A结点,选择另外一个分支D.依次这样循环下去,最终可以得到一个最短路径.   广度优先搜索   广度优先搜索是一层层地进行搜索,最后会发现自己得到了到达目标的路径.如上图所示,一层一层地计算,S可以到达A和B,从A可以到达B,D,这样一层一层的遍历,路径的数量会增长的非常快,但是最终我们也会得到一个最短路径.    来源: https://www.cnblogs.com/xiaochi/p/11422199.html

迪杰斯特拉最短路径

∥☆過路亽.° 提交于 2019-11-28 18:43:26
以4 a b 1 b c 6 a c 6 a d 2 d c 7 b e 6 c e 4 c f 5 d f 1 f e 6 e g 8 f g构造有向图并找出最短路径 #include <stdio.h> #include <stdlib.h> #define MaxVertexNum 100 #define BIG 100 typedef char VertexType;//顶点节点的数据类型 typedef int EdgeType;//边权值的数据类型 typedef struct{ VertexType Vertex[MaxVertexNum];//顶点表 EdgeType Edge[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表 int vertexnum,arcnum;//顶点数和边数 }MGraph;//邻接矩阵的存储结构 int Locate(VertexType v){ if(v>=97){return (int)v-97;} else {return (int)v-65;} }//将顶点转换为相应的位置 typedef struct{ int vertex[MaxVertexNum]; int top; }Stack; void CreatGraph(MGraph &M){ EdgeType e; VertexType v1,v2;

LeetCode 访问所有节点的最短路径(广度优先搜索)

一笑奈何 提交于 2019-11-28 13:46:48
给出 graph 为有 N 个节点(编号为 0, 1, 2, …, N-1)的无向连通图。 graph.length = N,且只有节点 i 和 j 连通时,j != i 在列表 graph[i] 中恰好出现一次。 返回能够访问所有节点的最短路径的长度。你可以在任一节点开始和停止,也可以多次重访节点,并且可以重用边。 示例 1: 输入:[[1,2,3],[0],[0],[0]] 输出:4 解释:一个可能的路径为 [1,0,2,0,3] 示例 2: 输入:[[1],[0,2,4],[1,3,4],[2],[1,2]] 输出:4 解释:一个可能的路径为 [0,1,4,2,3] 提示: 1 <= graph.length <= 12 0 <= graph[i].length < graph.length 思 路 分 析 : \color{blue}思路分析: 思 路 分 析 : 首先这道题的“最短路径”并不是指路径中各条边的和的最小值,而是指路径中出现的边的条数最少。因此我们要找到一条路径,这条路径中边的条数最少,并且经过了所有点。其中graph是邻接表,graph[i]代表它能到达的点集合,graph[i][j]代表节点i、j之间有边。并且题干中说明美个点、每条边可以经过多次。 那么这道题比较关键的地方就是如何记录一条路径中已经访问过的点,由于1 <= graph.length <=