最短路径

hdu 1595 最短路算法dijkstra

时光怂恿深爱的人放手 提交于 2020-01-20 10:06:33
find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2094 Accepted Submission(s): 739 Problem Description 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

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

人走茶凉 提交于 2020-01-19 22:04:56
P3371 【模板】单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779 。 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。 输入格式 第一行包含三个整数 n,m,s n , m , s,分别表示点的个数、有向边的个数、出发点的编号。 接下来 m m 行每行包含三个整数 u,v,w u , v , w,表示一条 u \to v u → v 的,长度为 w w 的边。 输出格式 输出一行 n n 个整数,第 i i 个表示 s s 到第 i i 个点的最短路径,若不能到达则输出 2^{31}-1 2 3 1 − 1。 输入输出样例 输入 #1 复制 4 6 1 1 2 2 2 3 2 2 4 1 1 3 5 3 4 3 1 4 4 输出 #1 复制 0 2 4 3 说明/提示 【数据范围】 对于 20\% 2 0 % 的数据: 1\le n \le 5 1 ≤ n ≤ 5, 1\le m \le 15 1 ≤ m ≤ 1 5; 对于 40\% 4 0 % 的数据: 1\le n \le 100 1 ≤ n ≤ 1 0 0, 1\le m \le 10^4 1 ≤ m ≤ 1 0 4; 对于 70\% 7 0 % 的数据: 1\le n \le 1000 1 ≤ n ≤ 1 0 0

最短路径条数问题

北战南征 提交于 2020-01-19 21:55:27
单源点的最短路径:给定带权有向图G和源点v,求从v到G中其余各顶点的最短路径。 求解方法:Dijkstra算法,基本思想是 按路径长度递增的次序 产生最短路径的算法。若S为已求得最短路径的终点的集合,那么下一条最短路径(设其终点为x)或者弧(v,x),或者是中间只经过S中的顶点而最后到达顶点x的路径。 广度优先搜索的思想: 假设从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使 “先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问 ,直至图中所有已被访问的顶点的邻接点都被访问到。由于在访问的过程中,要按照访问顺序来访问已访问顶点的邻接点,因此蕴含了一种 “先进先出” 的思想,可以使用队列来完成这个任务。 #include <iostream> #include <queue> #include <string.h> #include <stdio.h> using namespace std; const int N=16; int shortest_path(int G[N][N]) { int step[N]; //从源点出发,每个结点最快第几步到达 int stepchoice[N]; //从源点出发,最短路径的走法有几种 memset(step,0,sizeof(int)*N); memset

最短路径条数问题

一个人想着一个人 提交于 2020-01-19 21:48:12
问题描述: 给定如图所示的无向连通图,假定图中所有边的权值都为1,显然,从源点A到终点T的虽短路径有多条,求不同的最短路径的数目。 权值相同的最短路径问题,则但愿点Dijkstra算法退化成广度优先搜索,假定起点为0,终点为N。 用 动态规划 的思想: 使用两个辅助数组: 步数:step[0...N],记录从起点到某个顶点i的走的最小步数; 路径条数:path[0...N],记录从起点到某个顶点的最短路径的条数; 总体思路是:根据步数更新最短路径的条数。 考虑:当从当前顶点i扩散到其某相邻顶点j时: 如果step[j] == 0,说明之前还没有路径到达过顶点j;活着step[j] > step[i] + 1,则说明之前有顶点走过这条边,且步数还要比目前走的路径长,因此可以用当前路径i的信息更新j. 则step[j] = step[i] + 1; path[j] = path[i]; 如果step[j] == step[i] + 1,说明之前有顶点走过这条边,并且步数跟从i到j的步数一样,都是最短路径,因此更新j. step[j] 不变; path[j] = path[j] + path[i]; 用队列保存目前遍历的节点。 Code: class NumOfShortestPath { private int[][] aja = { /*0*/{0,1,0,0,1,0,0,0,0,0

Day 4

时间秒杀一切 提交于 2020-01-19 18:56:58
并查集 描述 并查集保持一组不相交的动态集合S={S1,S2,…,Sk}。 每个集合通过一个代表来识别。 代表就是集合中的某个成员。 哪一个成员被选做代表是无所谓的。 我们关心的是如果寻找某一动态集合的代表两次,并且在两次寻找之间不修改集合,两次得到的答案应该是相同的。 操作 初始化,查询树根,合并 应用 简单应用:统计一个无向图中连通子图的个数 对于每个V中的顶点v,Make-Set(v) 对于每个E中的边(u, v),如果Find-Set(u)!=Find-Set(v),则Union(u, v) 最后统计有几个集合即可。(统计代表的个数) 并查集实现 用有根树来表示集合 树中的每个节点都表示集合的一个成员 每棵树表示一个集合。 每个成员仅指向其父节点。 每棵树的根表示代表,且它是它自己的父节点。 思考之前的三个操作分别对应树上的什么操作? Make-Set —创建一颗仅包含一个节点的树 Find-Set —沿着父节点指针一直找下去,直到找到树根为止 Union —使得一颗树的根指向另一棵树的根。 时间复杂度 如果不优化,就在链的情况下,复杂度为O(n) 优化方法 按秩合并?? —目的是使包含较少节点的树的根指向包含较多节点的树的根。 目的是使包含较少节点的树的根指向包含较多节点的树的根。 我们并不记录以每个节点为根的子树的大小。采用一种简化分析的方法。对每个节点,用秩

Dijkstra Floyed SPFA 辨析

蓝咒 提交于 2020-01-19 16:48:07
一、Dijkstra O(nlogn) 单源最短路径 这个算法加上堆优化之后还是非常推荐的 但是dijkstra有一些不足的地方 边权不能为负数 不能判断负环 二、SPFA 最大是 O(mn) 单源最短路径 这个算法其实还是非常玄学的 要是运气不好的话会到达O(mn) 所以 不好掌控时间复杂度 但是它也有一些得天独厚的优势 它可以有负权边 也可以判断负环 判断负环的方法: 如果一个顶点入队列的次数超过n次 说明该图中存在负环 三、Floyed O(n^3) 多源最短路径 这个算法跑的很慢 在n不大的情况下可以用用 但是它 可以算出任意两个点之间的最短路径 还是非常不错的 来源: https://www.cnblogs.com/akioi/p/12214003.html

POJ 3463

点点圈 提交于 2020-01-19 15:30:50
//题目类型;最短路-—最短路和相差一个单位的次短路的条数和 //本题关键在于理解Dijkstra的贪心思想 解题思路: 本题若开始直接在Dijkstra中加入针对加1的递推式, 必须在Dijkstra的过程中加入DFS, 很繁琐. 改换求次短路, 然后判断次短路是否比最短路长1. 解法一、A*求第K短路,把前面K条路都求出来,pku 2449 ,但是据说这个题的最后答案超过10^8,把路全部找出来肯定会爆priority_queue 解法二、 改进Dijkstra算法,。将状态扩展到二维,第一维仍然是顶点编号,第二维的长度为2,分别用于记录最短路和次短路。 这样的数据有两个,dist[][2]记录距离,cnt[][2]计数。 更新状态时: 1)新值小于最短路径长:更新最短路径长,计数;次短路径长,计数 2)新值等于最短路径长:更新最短路径计数 3)新值大于最短路径长,小于次短路径长:更新次短路径长,计数 4)新值等于次短路径长:更新次短路径计数 值得注意的是,题目图有重边,所以不能用邻接矩阵存储。 本题可以与UESTC 1053 Shortest road(只求最短路的条数,但最短路中的路径只有一条不同即可),HDU 1459(只求最短路的条数,但是不同最短路的最短路的不能包含相同的路)。本题和UESTC 1053 Shortest road最短路均可重复,只有一条不同即可。

Floyd算法(求最短路)

删除回忆录丶 提交于 2020-01-19 15:27:20
Floyd算法 摘自:百度百科:http://baike.baidu.com/view/14495.htm 百科名片 弗洛伊德算法 Floyd 算法 又称为 弗洛伊德算法 ,插点法,是一种用于寻找给定的 加权图 中顶点间 最短路径 的算法。该 算法 名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授 罗伯特·弗洛伊德 命名。 核心思路 通过一个图的权值 矩阵 求出它的每两点间的 最短路径 矩阵 。 从图的带权 邻接矩阵 A=[a(i,j)] n×n开始, 递归 地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出 矩阵 D(n)。 矩阵 D(n)的i行j列元素便是i号顶点到j号顶点的 最短路径 长度,称D(n)为图的 距离矩阵 ,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。 采用的是(松弛技术),对在i和j之间的所有其他点进行一次松弛。所以 时间复杂度 为O(n^3); 其状态转移方程如下: map[i,j]:=min{map[i,k]+map[k,j],map[i,j]} map[i,j]表示i到j的最短距离 K是穷举 i,j的 断点 map[n,n]初值应该为0,或者按照题目意思来做。 当然,如果这条路没有通的话,还必须特殊处理,比如没有map

最短路径问题-Floyd算法

醉酒当歌 提交于 2020-01-19 15:25:35
概念 最短路径也是图的一个应用,即寻找图中某两个顶点的最短路径长度。 实际应用:例如确定某两个城市间的坐火车最短行车路线长度等。 Floyd algorithm 中文名就是弗洛伊德算法。 算法思路:用邻接矩阵来存储图的结构,edge[i][j]表示从结点i到结点j的最短路径长度,那么该如何计算edge[i][j]呢?首先我们可以假设当前的edge[i][j]不是最短的路径长度,必须经过k结点,比较edge[i][i]与edge[i][k]+edge[k][j]的大小(其中k的取值为所有点的编号),如果前者小,则表明i到j的最短路径为当前的edge[i][j];如果后者小,那么就需要修改当前的edge[i][j],使得edge[i][i]=edge[i][k]+edge[k][j]。 ok,下面用代码表示一下: for (int k = 1; k <= n; k++) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (edge[i][k] == MAX || edge[k][j] == MAX) continue; if (edge[i][j] == MAX || edge[i][k] + edge[k][j] < edge[i][j]) edge[i][j] = edge[i][k] + edge

Floyd算法(弗洛伊德算法)

我们两清 提交于 2020-01-19 15:24:30
算法描述:   Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。 核心思路:通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 算法过程:   把图用邻接距阵G表示出来,如果从Vi到Vj有路可达,则G[i,j]=d,d表示该路的长度;否则G[i,j]=无穷大。定义一个距阵D用来记录所插入点的信息,D[i,j]表示从Vi到Vj需要经过的点,初始化D[i,j]=j。把各个顶点插入图中,比较插点后的距离与原来的距离,G[i,j] = min( G[i,j], G[i,k]+G[k,j] ),如果G[i,j]的值变小,则D[i,j]=k。 在G中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息。比如,要寻找从V5到V1的路径。根据D,假如D(5,1)=3则说明从V5到V1经过V3,路径为{V5,V3,V1},如果D(5,3)=3,说明V5与V3直接相连,如果D(3