最短路径

地铁线路具体实现方法

无人久伴 提交于 2019-12-01 08:24:40
1、数据存储方式 最初采用map存储(地铁线路,站定名称,转站线路)。 1 营口道 3 这样在查询某条线路的所有站点时,可以便于查询。 同时可以得知某个站点是否为转站的车站,以及转站的线路。 不过在完成最短路径查询的需求时,发现难以将一条先上的站点按顺序串联起来,难以完成最短路径的查询。 网上查询相关代码后,改变存储方式为(前一站,后一站,两站间距离)。 由于题目中没有给出两站的距离,因此两站的距离均设为1。 南孙庄 南何庄 1 这种数据的存储方式能够确保一条地铁线路的所有站点串连起来,方便之后进行最短路径查找。 2、需求1导入txt文件 InputStreamReader instream = new InputStreamReader(new FileInputStream(file)); BufferedReader reader = new BufferedReader(instream); 通过(line = reader.readLine()) != null判断循环条件将txt文本文件里的地铁线路信息读入 String nodeName1 = items[0]; String nodeName2 = items[1]; int length = Integer.valueOf(items[2]); 3、查询指定地铁线经过的站点 由于采用前一站,后一站

地铁出行线路规划

百般思念 提交于 2019-12-01 07:24:44
地铁出行线路规划 github: 31701022 问题回顾 实现一个能正确处理命令行的计算地铁最短路径的程序 首先根据需求设计可读入文件 第一行是线路,从第二行开始每一行表示对应线路的站点,线路之间和站点与站点之间用、分隔 1号线、2号线、4号线、5号线... 苹果园、古城、八角游乐园、八宝山... 西直门、积水潭、鼓楼大街、安定门... 安河桥北、北宫门、西苑、圆明园、北京大学东门... 宋家庄、刘家窑、蒲黄榆、天坛东门、磁器口... ...... ...... 创建一个station类用于存储站点对象,存储站点名和对应的线路和相邻站点,省略get/set方法 public class station { private String name; public station prev; public station next; private Map<station,LinkedHashSet<station>> orderSetMap = new HashMap<station,LinkedHashSet<station>>(); private String line; public station (String name){ this.name = name; } 采用getAllPassedStations方法得到从起点站到终点站的所有路径集合 public

个人项目——地铁

江枫思渺然 提交于 2019-12-01 07:06:32
地铁个人项目 项目下载 1、PSP表格: PSP 2.1 Personal Software Process Stages Time Planning 计划 · Estimate ·估计这个任务需要多少时间 24h Development 开发 · Analysis · 需求分析(包括学习新技术) 4h · Design Spec · 生成设计文档 2h · Design Review · 设计复审(和同事审核设计文档) — · Coding Standard · 代码规范(为目前的开发制定合适的规范) — · Design · 具体设计 2h · Coding · 具体编码 7h · Code Review · 代码复审 — · Test · 测试(自我测试、修改代码、提交修改) 1h Reporting 报告 1h · Test Report · 测试报告 1h · Size Measurement · 计算工作量 — · Postmortem & Process Improvement Plan · 事后总结,并提出过程改进计划 2h 合计 20h 2、模块划分与设计 整个项目划分为4个模块: 模块名 职责 主控模块 判断用户输入的请求以实现对应功能 数据读取模块 读取记事本中内容并转换成需要的图结构 算法分析模块 进行最短路径选取及地铁线路输出 参数模块 保存各种表结构

北京地铁最短路径实现

落爺英雄遲暮 提交于 2019-12-01 07:06:31
北京地铁最短路径规划 github地址 [github] https://github.com/luolingjie77/subway 需求理解 将地铁线路保存成一个可读入,简洁明了的文本 程序能正确读入这个文件,并获取地铁线路信息 程序能正确处理输入的命令行 地铁能正确输出指定地铁线经过的站点 程序能正确输出两个站点间的最短路径 程序要有健壮性,能通过各类性能测试 按要求编写博客,详细说明花费时间,代码,各个模块和测试用例 文本存储方式 该文本直接保存进了各条线路的各个站点,没有在文本中考虑换乘点。当读入“一号线”等文字时,将它转换为线路的id号,然后在way数组中作为下标,将后面的各个站点的id号存储进去。换乘情况的话,因为每新读入一个站点,都会给它赋一个id号,所以只要每次判断该站点是否有id号了,如已存在,该站点就是换乘点,保存换乘信息。例如上图中一号线的西单,在四号线中也存在,所以该站点就可以换乘一号线或四号线。 实际所需时间 模块结构 共一个类:Subway Subway类共有六个函数: public static void searchWay(String name, String args):该函数的目标是用来满足需求二,保存所查询线路的各个站点。name就是通过命令行输入的线路的名称,args就是保存信息的文件名称。 该函数先通过if语句判断来得到线路的id号

地铁最短路径代码分析

╄→尐↘猪︶ㄣ 提交于 2019-12-01 05:40:29
地铁最短路径代码分析 相关链接: https://github.com/jindsad/subwayDijkstra 实验要求说明: 根据实验要求,要实现5块部分。 1.导入txt中储存的地铁线路。 2.通过地铁线路生成地铁图,并记录每条线路的站点。 3.通过Dijkstra算法算出最短路径,储存在列表中。 4.遍历路径列表,记录线路转变,存入字符串。 5.将最短路径字符串导出txt。 模块分析: 保存站点和线路的类 站点类名Vertex包含属性有名字,相邻节点,所属线路,距离起始点最短路径,在最短路径中的上一个节点,是否已经被遍历。 public class Vertex { public final String name; public ArrayList<Vertex> neighbour=new ArrayList<Vertex>(); public ArrayList<String> line=new ArrayList<String>(); private int adjuDist; private Vertex parent; private boolean known=false; } 线路类line包含线路名字,拥有的站点。 public class line { public final String name; public List<String>

黑暗城堡

元气小坏坏 提交于 2019-12-01 02:38:53
描述 在顺利攻破Lord lsp的防线之后,lqr一行人来到了Lord lsp的城堡下方。Lord lsp黑化之后虽然拥有了强大的超能力,能够用意念力制造建筑物,但是智商水平却没怎么增加。现在lqr已经搞清楚黑暗城堡有N个房间 (1≤N≤1000),M条可以制造的双向通道,以及每条通道的长度。 lqr深知Lord lsp的想法,为了避免每次都要琢磨两个房间之间的最短路径,Lord lsp一定会把城堡修建成树形的;但是,为了尽量提高自己的移动效率,Lord lsp一定会使得城堡满足下面的条件:设 D[i] 为如果所有的通道都被修建,第 i 号房间与第1号房间的最短路径长度;而 S[i] 为实际修建的树形城堡中第 i 号房间与第1号房间的路径长度;要求对于所有整数 i(1≤i≤N),有 S[i]=D[i] 成立。 为了打败Lord lsp,lqr想知道有多少种不同的城堡修建方案。于是lqr向applepi提出了这个问题。因为applepi还要忙着出模拟赛,所以这个任务就交给你了。当然,你只需要输出答案对 2^31–1 取模之后的结果就行了。 输入 第一行有两个整数N 和M。 之后M 行,每行三个整数X,Y 和L,表示可以修建X 和Y 之间的一条长度为L 的通道。 输出 一个整数,表示答案对 2^31–1 取模之后的结果。 样例输入 3 3 1 2 2 1 3 1 2 3 1 样例输出

图-最短路径问题

寵の児 提交于 2019-11-30 18:29:02
  从某个源点到其余各顶点的最短路径 迪杰斯特拉(Dijkstra)算法 迪杰斯特拉算法是一个按路径长度递增的次序产生最短路径的算法。(负值圈该算法无效) 算法描述: 假设用带权的邻接矩阵 arcs表示带权有向图,arcs[i][j]表示弧<vi,vj>上的权值;若<vi,vj>不存在,则arcs[i][j]为∞,S为已找到的从v0顶点出发的最短路径的终点的集合,初始状态为空. 选择 v0到 V-S中顶点构成的最短路径<v0,vj>,并将vj加入S。 由于vj加入到S中,最短路径发生变化,修改v0到V-S可能的最短路径 重复第2、3步n-1次,得到从v0到图上其余顶点的最短路径是依次递增的序列 该算法最终的得到的是一个递增的最短路径序列,每次循环中是先找到剩余路径中的最短的一条,再更新一下剩余的最短路径,好像一个选择排序一样,每次选择后面的最小的一个放到前面,最终的到一个有序序列,该序列就是从源点到图中各个顶点的最短路径。 /* G.arcs : 带权邻接矩阵 vo : 源点 P : 存储路径的矩阵 D : 存储 v0到 vi的最短路径长度 */ void shortestPath_DLJ(MGraph G, int v0, PathMatrix &P, ShortPathTable &D) { /* 求从 v0顶点到其余顶点 v的最短路径P[v]及带权长度D[v] P[v][w

掌握动态规划,助你成为优秀的算法工程师

余生颓废 提交于 2019-11-30 18:08:25
1.导论 相信很多同学已经在为今年的校招做准备了,随着AI的火热,越来越多的同学涌入了算法的行当之中。那去年校招的算法岗是有多火热?在知乎上看到这么一条帖子,先不说内容哈,足足400w+的阅读量啊。 不光是计算机或软件专业的学生,很多电子,通信,自动化等相关专业的同学也吸引了进来。当然,这应该是件好事。但是相当一部分同学,在学习的过程中,尤其是刚入门的时候,可能会有这样一个疑问:算法工程师的算法,为什么不是指《算法导论》中的算法(以下称为经典算法,用以区分),而是指机器学习里的算法。都叫算法(Algorithm),但好像不是一回事啊,两者有什么关系,又有什么区别呢? 本文试图通过动态规划这一经典算法中的重要内容,同时又在机器学习算法中有着广泛的应用,来简单探讨一下这两种“算法”。 2.动态规划 首先,动态规划(Dynamic Programming)是《算法导论》中的重要章节,同时也是在机器学习算法中有着非常重要应用的一种优化算法。可以说是,无论是否是算法工程师都应该掌握的一种算法。再功利一点说,动态规划也是诸多面试官特别喜欢考的一种题型,下面就带大家稍微温故一下。 按照教材[1]的介绍,动态规划通常需要按如下4个步骤来进行设计: 刻画一个最优解的结构特征。 递归地定义最优解的值。 计算最优解的值,通常采用自底向上的方法。 利用计算出信息构造一个最优解。 简单点说

多源最短路径算法—Floyd算法

北战南征 提交于 2019-11-30 15:53:48
前言 在 图论 中,在寻路最短路径中除了 Dijkstra 算法以外,还有 Floyd 算法也是非常经典,然而两种算法还是 有区别 的,Floyd主要计算多源最短路径。 在单源正权值最短路径 ,我们会用 Dijkstra算法 来求最短路径,并且算法的思想很简单—— 贪心算法 :每次确定最短路径的一个点然后维护(更新)这个点周围点的距离加入预选队列,等待下一次的抛出确定。但是虽然思想很简单, 实现起来是非常复杂 的,我们需要邻接矩阵(表)储存长度,需要优先队列(或者每次都比较)维护一个预选点的集合。还要用一个boolean数组标记是否已经确定、还要--------- 总之, Dijkstra 算法的 思想上是很容易接受 的,但是 实现上其实是非常麻烦 的。但是单源最短路径没有更好的办法。复杂度也为 O(n2) 而在n节点多源最短路径中,如果 从Dijkstra算法的角度上 ,只需要将Dijkstra封装,然后执行n次Dijkstra算法即可,复杂度为 O(n3) 。但是这样感觉很臃肿,代码量巨大,占用很多空间内存。有没有啥方法能够稍微变变口味呢? 答案是有的,这就是易写但稍需要理解的 Floyd 算法。一个求多元最短路径算法。 算法介绍 先看看百度百科的定义吧: Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似

SPFA算法

蹲街弑〆低调 提交于 2019-11-30 14:30:09
定义 SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环。 原理 动态逼近法: ① 设立一个队列用来保存待优化的结点。 ② 优化时每次取出队首结点 u,并且用 u 点当前的最短路径估计值对 u 点所指向的结点 v 进行松弛操作,如果 v 点的最短路径估计值有所调整,且 v 点不在当前的队列中,就将 v 点放入队尾。 ③ 这样不断从队列中取出结点来进行松弛操作,直至队列空为止。 如果某个点进入队列的次数超过 N 次则存在负环。 松弛操作利用三角不等式:“三角形两边之和大于第三边”。 所谓对结点 i, j 进行松弛,就是判定是否 dis[j] > dis[i] + w[i,j],如果该式成立,则 dis[j] = dis[i] + w[i,j],反之不变。 简单地说,如果一个点的最短路被更新了,那么需要判断与此点连接的其他点是否也需要更新。 实现 代码 #include<bits/stdc++.h> using namespace std; const int maxn=1005; const int inf=0x3f3f3f3f; struct node { int v,w; node(){} node(int a,int b) {v=a;w=b;} }; int n,m; vector<node> e[maxn];