最短路径

(机考)最短路径

…衆ロ難τιáo~ 提交于 2019-12-05 05:36:48
最短路径 描述: 求图中任意两个顶点之间的最短路径。 输入: 输入数据第一行是一个正整数,表示图中的顶点个数n(顶点将分别按0,1,…,n-1进行编号)。之后的n行每行都包含n个整数,第i行第j个数表示顶点i-1和顶点j-1之间的边长,用10000来表示两个顶点之间无边。后面每行2个数字,表示一对待求最短路径的顶点,用-1 -1表示输入结束,-1 -1不求解。 输出: 每对待求最短路径的顶点输出两行数据:第一行输出两个顶点间的最短路径长度,第二行输出最短路径,要按顺序输出顶点编号序列,顶点间用空格隔开。当两个顶点间没有路径时,只在一行上输出字符串“NO”。 示例输入 7 0 12 10000 10000 10000 10000 10000 12 0 10000 10000 3 10000 10000 10000 10000 0 10000 10000 21 11 10000 10000 10000 0 10000 10000 10000 10000 3 10000 10000 0 10000 8 10000 10000 21 10000 10000 0 10000 10000 10000 11 10000 8 10000 0 0 2 0 3 5 0 2 1 1 5 -1 -1 示例输出 34 0 1 4 6 2 NO 55 5 2 6 4 1 0 22 2 6 4 1 43 1 4

两种单源最短路径算法及其正确性证明

做~自己de王妃 提交于 2019-12-05 01:03:31
(一)符号与概念 令$G$为连通有向图,其每一条有向边被赋予有限实数值,该值成为该条有向边的长度。从顶点$i$到顶点$j$的有向边长度记做$w(i,j)$,若顶点$i$与顶点$j$没有有向边连接,此时$w(i,j)=\infty$。若图$G$中有一条有向路径$P$,则将该条路径上所有有向边的长度之和称为其长度,且将在所有以$s$为起点、以$t$为终点的有向路径中,长度最小的路径称为$s-t$最短路径。对于顶点$s$与顶点$t$,若存在$s-t$最短路径,则称路径长度为$s$到$t$的距离,记做$d(s,t)$。为了便于讨论,将图$G$上的顶点分别记做$1,2,...n$。下面具体阐述问题、算法及其证明。 (二)问题阐述 【单源最短路径问题】对于图$G$中的某一个顶点$i$,找出它到图上任意一个顶点$j$的$i-j$最短路径 来源: https://www.cnblogs.com/gyhhaha/p/11893897.html

ArangoDB 的graph查询

天涯浪子 提交于 2019-12-05 00:24:51
一个graph包含 vertices 和 edges。edges被存储在edges document当中。vertices可以是document collection 中的document也可以是edge document中的document。所以说edges也可以被当做vertices来使用。 1、数据准备 使用arangoimp导入飞机场和航班csv数据信息。 导入飞机场信息 arangoimp --file <em>path to airports.csv</em> on your machine --collection airports --create-collection true --type csv      这里我们创建了一个document collection;为每一行创建一个document.标题被作为属性名称。其中标题中包含一个_key的值,系统将自动识别该列作为_key. 现在打开浏览器(http://localhost:8529)便可以看到刚刚导入的信息了。 可以点击浏览器中的queries进行查询: 查询所有的机场 FOR airport in ariports RETURN airport      仅查询加利福尼亚机场信息 FOR airport IN airports FILTER airport.state==‘CA’ RETURN

白皮书P34-迷宫的最短路径

不羁的心 提交于 2019-12-04 23:44:38
题目描述: 样例: 题解:    这道题是典型的BFS题型,记录下一跳所有方向的数量,选择是进入下一步还是原地踏步,来进行步数的更新。当然,也可以开一个数组,利用前驱+1来记录每一个坐标到出发点点的最短距离。   除此之外,开一个数组不断记录前驱,可以找到终点到起点的路径。 代码: #include <iostream> #include <queue> #include <cstdio> #include <algorithm> using namespace std; int const N = 105; char mp[N][N]; int minstep = 10005; int tt[N]; struct Dian{ int x,y; }; queue<Dian> q; Dian d[N][N]; Dian start; void bfs(int step){ Dian s; if(!q.empty()){ s = q.front(); q.pop(); }else{ return; } if(mp[s.x][s.y] == 'G'){ if(step < minstep){ minstep = step; } return; } mp[s.x][s.y] = '#'; Dian tmp; if(mp[s.x-1][s.y] == '.' || mp[s.x-1][s.y

欧涛最短路【记录最短路径】

若如初见. 提交于 2019-12-04 16:30:54
题目链接: https://ac.nowcoder.com/acm/contest/1168/C 就是普通的最短路,建图时点的距离小于m的连双向边,写了这么久居然不知道怎么记录最短路的路径。在松弛里记录就好了,每次松弛都记录被松弛点的前驱,这样当一个点多次松弛的时候,就可以多次更新它的前驱,当它无法松弛时就是最短路径上的点,也就是记录下来的最后一次松弛的前驱。 然后从终点开始遍历前驱,存在数组中反向输出即可输出最短路径经过的点。 代码如下: 1 #include<bits/stdc++.h> 2 #define mem(a,b) memset(a,b,sizeof(a)) 3 const int MAXN = 650; 4 const double inf = 0x3f3f3f3f * 1.0; 5 using namespace std; 6 7 int n, k; 8 double m, dis[MAXN]; 9 int head[MAXN], cnt, vis[MAXN]; 10 int pre[MAXN]; 11 12 struct Node 13 { 14 double x, y, z; 15 }node[MAXN]; 16 17 struct Edge 18 { 19 int to, next; 20 double w; 21 }edge[MAXN * MAXN];

9.4 关系的闭包

独自空忆成欢 提交于 2019-12-04 13:41:05
9.4 关系的闭包 闭包的定义: 关系R对于性质P的闭包,是加入最小数量的序偶,使得R恰好符合性质P所得到的集合 R的闭包R 1 具有如下3个特点: ①. R 1 包含 R ②. R 1 具有性质P ③. 如果R 2 具有性质P且R 2 包含R, 那么R 2 包含R 1 就R的有向图而言: 找其自反闭包(reflexive closure) 添加循环/闭环 找其对称闭包(symmetric closure) 沿相反方向添加弧线(箭头) 找其传递闭包(transitive closure) 如果a到b连通, 那么就添加从a到b的弧线(箭头) 自反闭包(reflexive closure) 定理:R是定义在A上的关系,那么R的自反闭包r(R) = R∪△ 如何获得? ①. 在R的有向图的所有顶点上添加闭环 ②. 令R的邻接矩阵的对角线上全为1 对称闭包(symmetric closure) 定理①:R是定义在A上的关系,那么R的对称闭包s(R) = R∪R -1 NOTE : R -1 = {(b, a) | (a, b) ∈ R} NOTE : R -1 的邻接矩阵是R的邻接矩阵的转置, 即: M R T = M R -1 定理②:R是对称的,当且仅当 R = R -1 NOTE :在对称关系的有向图中,用无向的边来代替弧线(箭头) 路径(Paths) 假设R为定义在A上的关系

每对顶点之间的最短路径

我怕爱的太早我们不能终老 提交于 2019-12-04 13:08:05
Floyd void Floyd(MatGraph g) { int A[MAXV][MAXV]; int path[MAXV][MAXV]; int i, j, k; for (i = 0; i < g.n; i++) { for (j = 0; j < g.n; j++) { A[i][j] = g.edges[i][j]; if (i != j && g.edges[i][j] < INF) path[i][j] = i; else path[i][j] = -1; } } for (k = 0; k < g.n; k++) { for (i = 0; i < g.n; i++) { for (j = 0; j < g.n; j++) { if (A[i][j] > A[i][k] + A[k][j]) { A[i][j] = A[i][k] + A[k][j]; path[i][j] = path[k][j]; } } } } }    void Dispath(MatGraph g, int A[][MAXV], int path[][MAXV]) { int apath[MAXV], d; int i, j, k; for (i = 0; i < g.n; i++) { for (j = 0; j < g.n; j++) { if (A[i][j] < INF && i

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

落花浮王杯 提交于 2019-12-04 08:14:55
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我, 数据结构与算法应该要学习到哪个程度呢? ,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是 零散 的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过不错的文章给大家。大家也可以留言区补充。 一、算法最最基础 1、时间复杂度 2、空间复杂度 一般最先接触的就是时间复杂度和空间复杂度的学习了,这两个概念以及如何计算,是必须学的,也是必须最先学的,主要有最大复杂度、平均复杂度等,直接通过博客搜索学习即可。 文章推荐: 算法分析神器—时间复杂度 二、基础数据结构 1、线性表 列表(必学) 链表(必学) 跳跃表(知道原理,应用,最后自己实现一遍) 并查集(建议结合刷题学习) 不用说,链表、列表必须,不过重点是链表。 三分钟基础数据结构:如何轻松手写链表? 以后有面试官问你「跳跃表」,你就把这篇文章扔给他 2、栈与队列 栈(必学) 队列(必学) 优先队列、堆(必学) 多级反馈队列(原理与应用) 特别是优先队列,再刷题的时候,还是经常用到的,队列与栈,是最基本的数据结构,必学。可以通过博客来学习。相关文章: 三分钟基础知识:什么是栈?

动态规划最短路径LintcodeNO110

試著忘記壹切 提交于 2019-12-04 07:06:19
动态规划最短路径LintcodeNO110 简单的dp题,没啥好说的... class Solution { public: /** * @param grid: a list of lists of integers * @return: An integer, minimizes the sum of all numbers along its path */ int minPathSum(vector<vector<int>> &grid) { // write your code here const int DP_N = 1000; const int DP_M = 1000; int n = grid.size(); int m = grid[0].size(); int i,j; int dp[DP_N][DP_M]; memset(dp,0,DP_N * DP_M); //初始化dp数组的值 dp[0][0] = grid[0][0]; for(int t=1;t<n;t++) { dp[t][0] = dp[t-1][0] + grid[t][0]; } for(int k=1;k<m;k++) { dp[0][k] = dp[0][k-1] + grid[0][k]; } //开始dp for(i=1;i<n;i++) { for(j=1;j<m;j++) {

树链剖分(树剖)

北战南征 提交于 2019-12-04 01:00:46
毒瘤东西…然而某已逝联赛居然历年来搞了三道左右的树剖…唉~ 问题类型 顾名思义属于图论的东西。基于数据结构: 线段树 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式: 2 x y 表示求树从x到y结点最短路径上所有节点的值之和 操作3: 格式: 3 x z 表示将以x为根节点的子树内所有节点值都加上z 操作4: 格式: 4 x 表示求以x为根节点的子树内所有节点值之和 原理方法 那…我觉得我自己来描述也没什么好说的,不如搬来我觉得最好理解的博客吧。 洛谷日报:树链剖分 前置知识点应该加上一个 LCA ,但是树上差分似乎用处不大。 讲的很清晰,但是至少对于蒟蒻的我来说,他的板子代码确实让人难受的很 所以这里附上一份板子题链接与其代码(代码摘自zengqinyi from luogu) 板子题 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #define Rint register int #define mem(a,b) memset(a,(b),sizeof(a)) #define Temp template<typename T> using namespace std; typedef