最短路径

Dijkstra&&Floyd

為{幸葍}努か 提交于 2020-02-17 11:23:09
文章来源:( http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html ) (以下内容皆为转载) Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径。(单源最短路径) 2.算法描述 1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度

leetcode | 分类整理3(搜索)

依然范特西╮ 提交于 2020-02-11 17:10:53
搜索 : BFS:广度优先 每一层遍历的节点都与根节点距离相同 。设 di 表示第 i 个节点与根节点的距离,推导出一个结论:对于先遍历的节点 i 与后遍历的节点 j,有 di <= dj。利用这个结论, 可以求解最短路径等 最优解 问题 :第一次遍历到目的节点,其所经过的路径为最短路径。应该注意的是, 使用 BFS 只能求解无权图的最短路径。 在程序实现 BFS 时需要考虑以下问题: 队列:用来存储每一轮遍历得到的节点; 标记:对于遍历过的节点,应该将它标记,防止重复遍历。 1) 每一层遍历的节点都与根节点距离相同:决定了什么时候path++:就是每遍历一层之前保留queue.size,这个size就是这一层的大小 2) 什么时候置flag?已经从队列中poll了之后 3) 最优解问题:因为每次遍历的都是和根节点距离相同的节点,所以最先到达终点的一定是最短路径 1091. 二进制矩阵中的最短路径(m)(经典BFS+visited) 重点 :注意只有{0}一个数的情况 public int shortestPathBinaryMatrix(int[][] grid) { if(grid[0][0]==1 || grid[grid.length-1][grid[0].length-1]==1) return -1; if (grid.length == 1 && grid[0][0]

7.1最短路径问题

本秂侑毒 提交于 2020-02-11 14:32:21
最短路径问题的抽象 在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径 这条路径就是两点之间的最短路径 第一个顶点为源点 最后一个顶点为终点 问题分类 单源最短路径问题:从某固定源点出发,求其到所有其他顶点的最短路径 (有向)无权图 (有向)有权图 多源最短路径问题:求任意两顶点间的最短路径 无权图的单源最短路算法 按照递增(非递减)的顺序找到到各个顶点的最短路(BFS) void Unweighted ( Vertex S ) { Enqueue ( S , Q ) ; while ( ! IsEmpty ( Q ) ) { V = Dequeue ( Q ) ; for ( V 的每个邻接点 W ) if ( dist [ W ] == - 1 ) { dist [ W ] = dist [ V ] + 1 ; path [ W ] = V ; Enqueue ( W , Q ) ; } } } T = O(|V|+|E|) 有权图的单源最短路算法 不考虑负值圈 按照递增(非递减)的顺序找到到各个顶点的最短路 Dijkstra算法 令S = {源点s + 已经确定了最短路径的顶点v} 对任一未收录的顶点v,定义dist[v]为s到v的最短路径长度,但该路径仅经过S中的顶点。及路径{s->(vi∈S)->v}的最小长度 若路径是按照递增的顺序生成的,则

迪克斯特拉(Dijkstra)算法之MATLAB实现

给你一囗甜甜゛ 提交于 2020-02-11 06:36:58
好久没写算法,今天碰到个问题求最短路径竟然都写不出来了。 1. 迪克斯特拉(Dijkstra)算法 在网上面看了很多的解释,仍没有感觉到有非常通熟易懂的解释,在这里我为大家讲解一下,尽量避免枯燥难懂的数学公式。 狄克斯特拉算法。是从一个特定的顶点(又可称为原点,可自己定义)到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。举个例子,通熟易懂 . 圆圈表示一个顶点,每两个圆圈之间的线段上面的数字表示权值,这个权值可以表示从一个点到另外一个点所需要的时间,距离等等花销,在本例,表示距离。。每个圆圈里面写着原点到这个点的距离。 我们先设置两个顶点的集合T和S: 1)S中存放已找到最短路径的顶点,初始时,集合S中只有一个顶点,即、原点V0,我们在V0圆圈内写0,本身到本身的距离时0 2)T中存放当前还没找到最短路径的顶点,我们将除了V0以外的所有点的距离写无穷大,在这里我们都写99。 找到S中的第一个点s(1),即原点,从原点开始,寻找与s(1)相连的最近一层的权值最小的点 找到S中的第二个点s(2),即在与原点相连的权值2,6,,9找到最小权值2,将其所对应的点的圆圈里面写2,表示原点到这个点的最短距离为2 找到S中第三个点s(3)的最短路径,写上3,,表示原点到这个点的最短距离为3,记住

120.三角形最短路径(leetcode)

淺唱寂寞╮ 提交于 2020-02-08 17:51:38
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。 法1): 本题典型的回溯算法,但是没有剪枝,在42/43个case的时候超时了,以下是代码。 PS:尝试过如果当前和大于全局最小,则停止,但是由于有负数的存在,现在大的值也可以通过-9999成为最小值,剪枝失败。 class Solution: def minimumTotal(self, triangle: List[List[int]]) -> int: if not triangle or not triangle[0]: return 0 depth = len(triangle)-1 self.minSum = 9999 def helper(curSum,curdepth,j): if curdepth == depth: if curSum<self.minSum: self.minSum = curSum return helper(curSum+triangle[curdepth + 1][j],curdepth+1,j) helper(curSum+triangle[curdepth + 1][j+1],curdepth+1,j+1) helper(triangle[0][0],0,0) return self.minSum 法2)动态规划 用动态规划之前,必须想清楚,空间换时间

最短路之Dijkstra

自闭症网瘾萝莉.ら 提交于 2020-02-08 16:55:20
简介 Dijkstra算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展(BFS思想),直到扩展到终点为止 Dijkstra不能处理带负权和带有回路的图 算法思想 设起点为u,引入两个集合S、U,S集合包含已求出的最短路径的点,U集合记录未求出最短路径的点以及到起点的距离 初始化两个集合,S集合初始时只有起点,U集合初始时为起点到其他节点的距离(详细来说是起点到本身的距离为0,起点未直接连接点的距离为INF) 从U集合中找出路径最短的点k,加入S集合并从U集合中删去该点 遍历所有节点,如果某节点v使得u到k再到v的距离小于当前u到v的距离,则更新U中相应的距离 循环上述3、4步骤,直至遍历结束,得到起点到其他节点的最短路径 简单分析上述思路,我们可以得到下列伪代码(紫书p359) 清除标记数组中所有点的标记 设d [ s ] = 0 , 其他d [ i ] = INF , s是起点 循环n次 { 在所有未标记节点中选出d值最小的节点k 给节点k标记 对于从k出发的所有边 ( k , i ) , 更新d [ i ] = min { d [ i ] , d [ k ] + w ( k , i ) } } 其中"更新d[i]=min{d[i],d[k]+w(k,i)}"称为边(k,i)的 松弛操作 代码实现 邻接矩阵 时间复杂度O(V

如何通俗地讲解 viterbi 算法?

好久不见. 提交于 2020-02-07 18:22:55
原文链接 一、通俗地讲解 viterbi 算法 这篇回答你绝对看得懂!如下图,假如你从S和E之间找一条最短的路径,除了遍历完所有路径,还有什么更好的方法? 答案:viterbi (维特比)算法。 过程非常简单: 为了找出S到E之间的最短路径,我们先从S开始从左到右一列一列地来看。 首先起点是S,从S到A列的路径有三种可能:S-A1、S-A2、S-A3,如下图: 我们不能武断的说S-A1、S-A2、S-A3中的哪一段必定是全局最短路径中的一部分,目前为止任何一段都有可能是全局最短路径的备选项。 我们继续往右看,到了B列。B列的B1、B2、B3逐个分析。 先看B1: 如上图,经过B1的所有路径只有3条:S-A1-B1S-A2-B1S-A3-B1以上这三条路径,我们肯定可以知道其中哪一条是最短的(把各路径每段距离加起来比较一下就知道哪条最短了)。假设S-A3-B1是最短的,那么我们就知道了经过B1的所有路径当中S-A3-B1是最短的,其它两条路径路径S-A1-B1和S-A2-B1都比S-A3-B1长,绝对不是目标答案,可以大胆地删掉了。删掉了不可能是答案的路径,就是viterbi算法(维特比算法)的重点,因为后面我们再也不用考虑这些被删掉的路径了。现在经过B1的所有路径只剩一条路径了,如下图: 接下来,我们继续看B2: 如上图,经过B2的路径有3条:S-A1-B2S-A2-B2S-A3

数据结构与算法题目集(中文)7-8 哈利·波特的考试 (25分)

蓝咒 提交于 2020-02-07 01:25:27
1.题目 哈利·波特要考试了,他需要你的帮助。这门课学的是用魔咒将一种动物变成另一种动物的本事。例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等。反方向变化的魔咒就是简单地将原来的魔咒倒过来念,例如ahah可以将老鼠变成猫。另外,如果想把猫变成鱼,可以通过念一个直接魔咒lalala,也可以将猫变老鼠、老鼠变鱼的魔咒连起来念:hahahehe。 现在哈利·波特的手里有一本教材,里面列出了所有的变形魔咒和能变的动物。老师允许他自己带一只动物去考场,要考察他把这只动物变成任意一只指定动物的本事。于是他来问你:带什么动物去可以让最难变的那种动物(即该动物变为哈利·波特自己带去的动物所需要的魔咒最长)需要的魔咒最短?例如:如果只有猫、鼠、鱼,则显然哈利·波特应该带鼠去,因为鼠变成另外两种动物都只需要念4个字符;而如果带猫去,则至少需要念6个字符才能把猫变成鱼;同理,带鱼去也不是最好的选择。 输入格式: 输入说明:输入第1行给出两个正整数N (≤100)和M,其中N是考试涉及的动物总数,M是用于直接变形的魔咒条数。为简单起见,我们将动物按1~N编号。随后M行,每行给出了3个正整数,分别是两种动物的编号、以及它们之间变形需要的魔咒的长度(≤100),数字之间用空格分隔。 输出格式: 输出哈利·波特应该带去考场的动物的编号、以及最长的变形魔咒的长度,中间以空格分隔

数据结构--图(中) 最短路径、Dijkstra、Floyd、旅游规划

僤鯓⒐⒋嵵緔 提交于 2020-02-05 16:55:02
最短路径问题 最短路径问题的抽象 在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径。 这条路径就是两点之间的最短路径 第一个顶点为源点 第二个顶点为终点 问题分类 单源最短路径问题:从某个固定源点出发,求其到所有其他顶点的最短路径: 1. 无权图 2.有权图 多源最短路径问题:求任意两顶点间的最短路径 无权单源最短路径算法 --BFS 按照递增的顺序找出到各个顶点的最短路,从而算出到终点的最短路。也可以想象为权值为1的有权单源最短路问题,解决这类问题最好的办法就是上次讲的BFS 宽度优先搜索算法 去解决。 这里以这个图为例,求从v1到v7的最短路径。 # include <iostream> # include <stdlib.h> # include <stack> # include <queue> # include <string.h> using namespace std ; int mat [ 100 ] [ 100 ] ; int v , e ; int start ; int stop ; void draw ( ) { cin >> v >> e ; cin >> start >> stop ; for ( int i = 0 ; i < e ; i ++ ) { int v1 , w1 ; cin >> v1 >> w1 ; mat [

机器学习 降维算法: isomap & MDS

空扰寡人 提交于 2020-02-04 12:00:26
  最近在看论文的时候看到论文中使用isomap算法把3D的人脸project到一个2D的image上。提到降维,我的第一反应就是PCA,然而PCA是典型的线性降维,无法较好的对非线性结构降维。ISOMAP是‘流形学习’中的一个经典算法,流形学习贡献了很多降维算法,其中一些与很多机器学习算法也有结合,先粗糙的介绍一下’流形学习‘。    流形学习   流形学习应该算是个大课题了,它的基本思想就是在高维空间中发现低维结构。比如这个图:      这些点都处于一个三维空间里,但我们人一看就知道它像一块卷起来的布,图中圈出来的两个点更合理的距离是A中蓝色实线标注的距离,而不是两个点之间的欧式距离(A中蓝色虚线)。   此时如果你要用PCA降维的话,它根本无法发现这样卷曲的结构(因为PCA是典型的线性降维,而图示的结构显然是非线性的),最后的降维结果就会一团乱麻,没法很好的反映点之间的关系。而流形学习在这样的场景就会有很好的效果。    经典MDS(Multidimensional Scaling)   如上文所述,MDS接收的输入是一个距离矩阵DD,我们把一些点画在坐标系里:      如果只告诉一个人这些点之间的距离(假设是欧氏距离),他会丢失那些信息呢?   a.我们对点做平移,点之间的距离是不变的。   b.我们对点做旋转、翻转,点之间的距离是不变的。