乘地铁方案的最优选择二(票价,距离)Floyd算法
来源:互联网 发布:淘宝店铺图片怎么弄 编辑:程序博客网 时间:2024/05/17 00:10
上一篇文章中是以Dijkstra算法实现的查找最短路径,还可以用Floyd算法实现。
在原类中添加一个方法:
public int findByFloyd(T start, T stop) {FLOYD floyd = new FLOYD(subTrainMatrix);int startPos = getPosInvertex(start);int stopPos = getPosInvertex(stop);int[] path = floyd.getPath(startPos, stopPos);StringBuilder sb = new StringBuilder();System.out.print("The path from " + start + " to " + stop + " : ");for (int i : path) {sb.append(vertex.get(i) + " --> ");}sb.delete(sb.lastIndexOf(" --> "), sb.length());System.out.println(sb.toString());return path.length;}
添加一个FLOYD类实现:
package com.patrick.bishi;/** * 以无向图G为入口,得出任意两点之间的路径长度length[i][j],路径path[i][j][k], 途中无连接得点距离用M表示,点自身也用0表示 * * @author patrick * */public class FLOYD {int[][] length = null;// 任意两点之间路径长度int[][][] path = null;// 任意两点之间的路径public FLOYD(int[][] G) {int row = G.length;// 图G的行数int[][] spot = new int[row][row];// 定义任意两点之间经过的点int[] onePath = new int[row];// 记录一条路径this.length = G;path = new int[row][row][];for (int i = 0; i < row; i++)// 初始化为任意两点之间没有路径for (int j = 0; j < row; j++)spot[i][j] = -1;for (int i = 0; i < row; i++)// 假设任意两点之间的没有路径onePath[i] = -1;for (int u = 0; u < row; ++u)for (int v = 0; v < row; ++v)for (int w = 0; w < row; ++w)if (length[v][w] > length[v][u] + length[u][w]) {length[v][w] = length[v][u] + length[u][w];// 如果存在更短路径则取更短路径spot[v][w] = u;// 把经过的点加入}for (int i = 0; i < row; i++) {// 求出所有的路径 i -> jint[] point = new int[1];// 经过的点数for (int j = 0; j < row; j++) {point[0] = 0;onePath[point[0]++] = i;// 起i点为自身outputPath(spot, i, j, onePath, point);// 更新onePathpath[i][j] = new int[point[0]];for (int s = 0; s < point[0]; s++)path[i][j][s] = onePath[s];}}}private void outputPath(int[][] spot, int i, int j, int[] onePath,int[] point) {// 输出i 到j 的路径的实际代码,point[]记录一条路径的长度if (i == j)return;if (spot[i][j] == -1)onePath[point[0]++] = j;// 中间没有经过其他节点,即直接到达else {outputPath(spot, i, spot[i][j], onePath, point);outputPath(spot, spot[i][j], j, onePath, point);}}public int[] getPath(int start, int stop) {return path[start][stop];}private static final int M = 99999;public static void main(String[] args) {int data[][] = {// 邻接矩阵{ 0, 3, 2000, 7, M }, { 3, 0, 4, 2, M }, { M, 4, 0, 5, 4 },{ 7, 2, 5, 0, 6 }, { M, M, 4, 6, 0 } };FLOYD floyd = new FLOYD(data);for (int i = 0; i < data.length; i++) {for (int j = i; j < data[i].length; j++) {System.out.print("From " + i + " to " + j + " length :"+ floyd.length[i][j]);System.out.print(", path is: ");for (int k = 0; k < floyd.path[i][j].length; k++)System.out.print(floyd.path[i][j][k] + " ");System.out.println();}}}}
两种方法可以比较下优劣,时间复杂度上如果将所有节点到其他节点的最短距离都求出来则都是O(n^3),空间上当然一样,用的都是邻接矩阵保存的。
- 乘地铁方案的最优选择二(票价,距离)Floyd算法
- 乘地铁方案的最优选择(票价,距离)
- java实现floyd统计天津地铁的站点距离
- floyd算法 (算每两点间的距离)
- 动态规划 (二) 最优矩阵链乘
- 浅析 AngularJS 全球化最优方案(二)
- 根据坐标行驶的距离算出最优路径Dijkstra(迪杰斯特拉算法)
- 监听listivew滚动距离最优方案
- MATLAB最小二乘最优问题
- Floyd算法,输出点x到y的最小距离
- 【乘地铁回家】诗一首
- 从多种解决方案中选择最优方案
- [算法]最优矩阵链乘(动态规划 记忆化搜索)
- 最优矩阵链乘(经典DP)
- 矩阵求导方法&最小二乘最优解求解过程
- 矩阵连乘最优次序 c++实现 动态规划算法
- 任务分配的最优方案
- 基于最小二乘算法的参数估计(matlab程序和测试)
- Sed命令
- 织梦系统如何设置URL绝对路径及绝对路径的好处
- cococs2d场景的分析
- 2013/09/13 C# WPF 学习笔记 ---- 块儿
- CH BR13数学(啥?-a^b≡a^b mod phi(p)+phi(p)(mod p)(b>=phi(p))公式)
- 乘地铁方案的最优选择二(票价,距离)Floyd算法
- org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 3解决方法
- C++堆内存空间详解(释放内存、内存泄露)
- linux程序自启动和新建linux 服务的方法
- cpu卡
- 面试题之——抽象类(abstract class)与接口(interface)的区别
- spring mvc 返回String时的中文乱码和IE下返回下载提示
- JS只能输入数字的文本框
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区