最短路径

基础实验6-2.5 城市间紧急救援 (25分)--dijkstra扩展

匆匆过客 提交于 2020-03-18 17:27:56
解题思路: 用dijkstra算法求单源最短路径,再用数组记录当前结点为终点时,最短路径的上一个结点的编号。 #include <stdio.h> #include <string.h> #define MaxVex 500+5 #define INF 0x3f3f3f3f int G[MaxVex][MaxVex];//图-邻接矩阵 int visit[MaxVex]= {0}; //标记访问数组 int path[MaxVex]= {-1}; //途经路径 int cnt[MaxVex];//最短路径数量 int dist[MaxVex];//最短路径 int rsc[MaxVex];//各城市救援队伍数量 int rs[MaxVex];//当前救援队伍数量 int Nv,Ne,s,d; //图的初始化 void Init() { int i,v1,v2,x; for(i=0; i<Nv; i++) { scanf("%d",&rsc[i]); rs[i]=rsc[i]; } memset(G,INF,sizeof(G)); for(i=0; i<Nv; i++) { G[i][i]=0; } for(i=0; i<Ne; i++) { scanf("%d %d %d",&v1,&v2,&x); G[v1][v2]=x; G[v2][v1]=G[v1][v2]; } for(i

Codeforces Round #625 D. Navigation System

放肆的年华 提交于 2020-03-17 21:35:11
Link 题意: 连通有向图 有一条已经计划好的从s到t的路径,你按照计划好的路径驾驶 在起点时,导航系统给出一条从起点到达终点的最短路径 计划路径可能和导航给出的最短路径不同 所以没当你按照出发前计划的路径移动一个点时,导航可能会重置最短路径 当最短路径不唯一时,导航会随机给出一条 问导航最少和最多重置最短路径几次 思路: 最短路 先倒着建图,通过bfs算出每个点到终点的距离 \(d\) 当从 \(u\) 移动到 \(v\) 时: 当 \(d[v]>d[u]-1\) 时,肯定会重置 当 \(d[v]=d[u]-1\) 时,若存在一个点 \(w(w \neq v)\) 使 \(d[w]+1=d[v]\) ,则可能会重置 代码: #include<bits/stdc++.h> using namespace std; const int N=200010; int n,m,k; int u[N],v[N]; int path[N]; int cnt,to[N],nxt[N],head[N]; int d[N]; void addedge(int u,int v) { cnt++; to[cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; } void bfs() { queue<int>q; q.push(path[k]); d[path[k]]=1;

floyed 算法计算最短路径

梦想的初衷 提交于 2020-03-11 04:04:37
在某些应用中,需要计算两个节点之间的最短路径,比较有名的是Dijkstra算法和floyed算法,都是基于节点的邻接关系求解任意两点的可达性和最短可达路径。 Dijkstra算法比较容易理解,无论是广度优先还是深度优先都可以根据具体应用场景进行选择,不过,在计算较为复杂的场景中,比如节点数比较多,存在众多环路等情况,由于仅仅知道邻接关系,Dijkstra算法就显得力不从心,经常会在无关路径上浪费大量时间。相对而言,floyed算法应付此种场景就显得轻松很多。不过floyed 算法对计算有较高要求,算法复杂度为N的3次方,适合于节点间的关系不会经常变动的情况,提前将任意两点间的路径计算好,需要时直接使用即可。而Dijkstra算法属于轻量级的,对计算要求不高,在50-100个节点内进行还是实时查找也会比较轻松,反馈时间也比较快。 floyed 算法用程序实现极其简单,只需要对节点个数进行三个循环,在完成算法后,通过路径矩阵找到任意给定两点的最短路径,向floyed算法学习,路径的查找算法采用递归方式,尽量写的简洁。 def init_matrix(relations): LEN = len(relations) INF = 99999 #初始化 距离矩阵和路径矩阵,默认所有位置都是INF D = [[INF for x in range(LEN)] for y in range

PAT甲级1001 Public Bike Management

﹥>﹥吖頭↗ 提交于 2020-03-11 03:23:54
Public Bike Management (30) 时间限制 1000 ms 内存限制 65536 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 There is a public bike service in Hangzhou City which provides great convenience to the tourists from all over the world. One may rent a bike at any station and return it to any other stations in the city. The Public Bike Management Center (PBMC) keeps monitoring the real-time capacity of all the stations. A station is said to be in perfect condition if it is exactly half-full. If a station is full or empty, PBMC will collect or send bikes to adjust the condition of that station to perfect. And more

最短路径之Dijkstra算法

寵の児 提交于 2020-03-08 12:11:08
Dijkstra算法有些类似于最小生成树中prim算法,从源点出发,每次选出一个最短路径,然后依次更新n次。 下面是代码实现 # include <iostream> # include <vector> # include <algorithm> using namespace std ; const int maxv = 101 ; const int inf = 10000000 ; struct node { int v , weight ; } ; vector < node > Adj [ maxv ] ; bool vis [ 101 ] ; //标记 int dis [ 101 ] ; //记录最短距离 int pre [ 101 ] ; //记录路径 //dijkstra算法 void dijkstra ( int n ) { fill ( vis , vis + n , false ) ; fill ( dis , dis + n , inf ) ; //初始化dis和vis for ( int i = 0 ; i < n ; i ++ ) pre [ i ] = i ; //路径初始化 dis [ 0 ] = 0 ; //这里求零点到各点最短距离 for ( int i = 0 ; i < n ; i ++ ) //循环n次 { int min = inf ,

图论学习笔记——最短路

我只是一个虾纸丫 提交于 2020-03-08 09:44:33
背景 最短路问题是重要的最优化问题之一,也是图论研究中的一个经典算法问题,它不仅直接应用于解决生产实践中的众多问题,如管道的铺设、线路的安排、厂区的选址和布局、设备等,而且也经常被作为一种基本工具,用于解决其他的最优化问题以及预测和决策问题。 赋权图 定义:对简单图G的没一边e赋予一个实数,记为 (e),称为边e的 权 ,二没变均赋予权的图称为 赋权图 。 最短路 定义:( , )—路的边权之和称为该路的长,而 , 间路长达到最小的路称顶点u和v的最短路。其 长度称为 和 的距离 ,记为 (x,y)。 最短路问题一般归为两类: (1)求从某个顶点(源点)到其他顶点(终点)的最短路径 (2)求图中每一对顶点间的最短路径。 关于最短路径的研究,目前有很多算法,但基本上是以Dijkstra和Floyd两种算法为基础的,因此这两种算法进行本质的研究非常重要。 设n阶无项或有向联通赋权图gG = (V,E),顶点集V= { , ,····· },边集E= { , ,···· },并且边或弧 上的权值为 ( ),其中 , =1,2,···, 。 显然,对于无向图来说,对任意 , =1,2,···, ,有 = ,故该图的权值矩阵W为对称矩阵。 首先,输入该赋权图的权值矩阵W= ,然后,为了求出两点的最短距离,可按照,只要反复使用,迭代公式 就可以得到最终结果,记为 其中 为从顶点 到顶点

动态规划求解库位分配问题

北城以北 提交于 2020-03-06 15:56:45
layout: post title: 基于动态规划的库位分配算法 subtitle: 使用拣货路径长度优化人到货拣货的仓库库位分配 date: 2020-01-15 author: ZS header-img: img/post-bg-ios9-web.jpg catalog: true tags: - Dynamic Program - Algorithm - Schedule 使用拣货路径长度优化人到货拣货的仓库库位分配 各位读者大家好,今天ZS给大家分享使用动态规划算法求解库位分配问题。算法的主要思想来自于论文:Exact route-length formulas and a storage location assignment heuristic for picker-to-parts warehouses。动态规划算法一直以来都是让人很摸不到头脑的算法,小编刚开始写这个程序的时候,真是写到崩溃,但是要始终相信社会主义核心价值观,只要思想不滑坡,就可以捋顺思路!言归正传,上! 动态规划算法典型算例 动态规划算法的核心思想是通过子问题的最优解求解出原问题的最优解。图1 所示,求从A到D的最短路径,如果已知从A到C1的最短路径Pac1,从A到C2的最短路径Pac2,从A到C3的最短路径Pac3,从A到C4的最短路径Pac4。那么从A到D的最短路径是 min{Pac1

MIT_AI_P5学习笔记

[亡魂溺海] 提交于 2020-03-05 18:23:34
05-搜索:最优、分支界限、A 1、引入 搜索是关于选择的 启发式距离:黑板上粉色的直线线段是现实中没有的,叫做启发式距离。 启发式找到的路不见得都能走得通,因为在现实中考虑问题的时候,离得近不一定是最好的,因为可能会出现死胡同 上节的爬山算法和束搜索,目的都是考虑离目标最近的距离 例子 2、最短路径的4种算法 1.branch bound分支限界 没有考虑离目标有多远,只考虑自己走了多远 直到积累的长度都已经大于等于到达目标的长度,就不需要再进行扩展了 总是扩展当前最短的路径,直到目标节点 把当前所有的路径都扩展出来,比较最后距离最短的 然后扩展最短的,再进行比较没有扩展的 只要没有负值长度,我们就肯定能得到一个最短路径 入队和扩展的概念 我们跟踪已经扩展过的节点,不再扩展。 这些放在队列中的所有路径就是入队列表 入队思想对于这些最短路径并不奏效 路径需要加到扩展队列(不是入队队列) 因为我们必须要保证扩展的都是短路径(最后要得到最短路径) 这个就相当于迪杰斯特拉算法,单独用一张列表来保存所有扩展,叫做扩展列表 2.分支限界+扩展列表 找到迄今为止最短的路径进行扩展(类似Dijkstra算法) 已经扩展过的,就不需要再扩展,这会减掉很多多余的树枝 死马原则(the dead horse principal):只要发现一条不是最短路径,就不再扩展它 3.可容许启发式 可容许启发式

PTA甲级考试真题练习3——1003 Emergency

巧了我就是萌 提交于 2020-03-05 12:53:19
题目: 思路: 该题就是求图的最短路径,首先注意求得是最短路径的数目而不是最短路径的长度,然后还有一个救援队的问题。下面使用两种方法解决该问题: (1)dijkstra算法: 基本思想:每次找到离源点(如1号节点)最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径。 基本步骤: 1,设置标记数组book[]:将所有的顶点分为两部分,已知最短路径的顶点集合P和未知最短路径的顶点集合Q,很显然最开始集合P只有源点一个顶点。book[i]为1表示在集合P中; 2,设置最短路径数组dst[]并不断更新:初始状态下,dst[i]=edge[s] i ,很显然此时dst[s]=0,book[s]=1.此时,在集合Q中可选择一个离源点s最近的顶点u加入到P中。并依据以u为新的中心点,对每一条边进行松弛操作(松弛是指由顶点s–>j的途中可以经过点u,并令dst[j]=min(dst[j],dst[u]+edge[u][j])),并令book[u]=1; 3,在集合Q中再次选择一个离源点s最近的顶点v加入到P中。并依据v为新的中心点,对每一条边进行松弛操作(即dst[j]=min(dst[j],dst[v]+edge[v][j])),并令book[v]=1; 4,重复3,直至集合Q为空。 代码: # include <iostream> # include

最短路之Floyd算法

╄→гoц情女王★ 提交于 2020-03-04 14:10:38
问题 已知一张有向图,求出每个点到其他点的最短路径,也就是多源最短路径的问题。 解析 Floyd算法的本质是一种动态规划的思想,它的转移方程为:mp[i,j]=min(mp[i,k]+mp[k,j],mp[i,j]),其中mp[i,j]代表从i点到j点的最短距离,所以可以枚举i点和j点,更新每个i到j的最短距离再枚举k,但是这样枚举计算mp[i,j],因为不能确定枚举的所有到k点为最短路径,一旦确定后,之后不会修改,所以应该先枚举k,再枚举i,j,这样就实现了Floyd算法。 从任意节点i到任意节点j的最短路径不外乎2种可能: 1)直接从节点i到节点j。 2)从节点i经过若干个节点k到节点j。 所以,我们假设mp(i,j)为节点i到节点j的最短路径的距离,对于每一个节点k,我们检查mp(i,k)+mp(k,j)<mp(i,j)是否成立,如果成立,证明从节点i到节点k再到节点j的路径比节点i直接到节点j的路径短,我们便设置mp(i,j)=mp(i,k)+mp(k,j),这样一来,当我们遍历完所有节点k,mp(i,j)中记录的便是节点i到节点j的最短路径的距离。 初始的距离矩阵: 0 2 6 4 inf 0 3 inf 7 inf 0 1 5 inf 12 0 本题的最短路径矩阵: 0 2 5 4 9 0 3 4 6 8 0 1 5 7 10 0 设计 枚举顶点k ∈ [ 1 , n