算法推导过程参见【dijkstra算法推导详解】

此文为【dijkstra算法代码实现】

https://www.cnblogs.com/Halburt/p/10767389.html

package a;

import java.util.Arrays;

/**
*         ┏┓   ┏┓+ +
*        ┏┛┻━━━┛┻┓ + +
*        ┃       ┃
*        ┃   ━   ┃ ++ + + +
*        ████━████ ┃+
*        ┃       ┃ +
*        ┃   ┻   ┃
*        ┃       ┃ + +
*        ┗━┓   ┏━┛
*          ┃   ┃
*          ┃   ┃ + + + +
*          ┃   ┃    Code is far away from bug with the animal protecting
*          ┃   ┃ +     神兽保佑,代码无bug
*          ┃   ┃
*          ┃   ┃  +
*          ┃    ┗━━━┓ + +
*          ┃        ┣┓
*          ┃        ┏┛
*          ┗┓┓┏━┳┓┏┛ + + + +
*           ┃┫┫ ┃┫┫
*           ┗┻┛ ┗┻┛+ + + +
*
* @Author:Halburt
* @Date:2019-04-24 下午 5:47
* @Description:
*/
public class DijkstraDemo { // 表示无穷大 即不可达
public static int NO_AIRPLANE = Integer.MAX_VALUE;
// 初始直飞价格表
public int[][] prices ;
// 最优转机价格表
public int[] minPrice ;
public boolean[] flag ;
private int citySize;
/**
* @param citySize 城市数量
*/
public DijkstraDemo(int citySize){
this.citySize = citySize;
// prices = new int [citySize][citySize];
flag = new boolean [citySize - 1];
minPrice = new int[citySize - 1 ];
}
public static int[][] getPrices(){
int ZH = 0,SH = 1, BJ = 2, GZ = 3,CQ = 4,NJ = 5, HZ = 6,LS = 7;
int[][] prices = new int[8][8];
//from Zhuhai
prices[ZH][CQ] = 1100;
prices[ZH][SH] = 600;
prices[ZH][BJ] = 900;
prices[ZH][GZ] = 200;
//others
prices[CQ][NJ] = 400;
prices[SH][CQ] = 400;
prices[SH][BJ] = 500;
prices[SH][NJ] = 200;
prices[BJ][SH] = 400;
prices[BJ][HZ] = 500 ;
prices[BJ][LS] = 1400;
prices[GZ][BJ] = 600 ;
prices[GZ][LS] = 1500 ;
prices[NJ][HZ] = 300 ;
prices[HZ][SH] = 200 ;
for(int i = 0 ; i < 8 ; i++){
for(int j = 0 ; j < 8 ; j++){
if(prices[i][j] == 0){
prices[i][j] = NO_AIRPLANE;
}
}
}
return prices;
}
public static void main(String[] args) {
DijkstraDemo demo = new DijkstraDemo(8);
demo.dijkstra(getPrices());
} public void dijkstra(int[][] prices ){
this.prices = prices;
// 初始化
// 初始化始发站价格表
for(int i = 1; i < citySize;i++){
minPrice[i-1] = prices[0][i];
}
System.out.println("初始化最优表:" + Arrays.toString(minPrice));
dijkstra();
System.out.println("最终最优价格表:" + Arrays.toString(minPrice));
} private void dijkstra(){
int min = Integer.MAX_VALUE;
int minIdx = Integer.MAX_VALUE;
// 找到最小的价格
for(int idx = 0 ; idx < minPrice.length ; idx ++ ) {
if(!flag[idx] && minPrice[idx] < min ){
min = minPrice[idx];
minIdx = idx ;
}
}//=已经没有最小的了
if(minIdx == Integer.MAX_VALUE){
return ;
}
//标记从该城市转机
flag[minIdx] = true;
minIdx += 1;
System.out.println("转机城市序号"+minIdx +" 价格"+ minPrice[minIdx -1]);
//获取该城市转机时飞往其他城市的价格表
int cityPrice = minPrice[minIdx -1];
//获取杭州飞往该城市的价格
int[] minCityPrices = prices[minIdx];
for(int idx = 1 ; idx < citySize ; idx ++ ){
int price = minCityPrices[idx];
// 如果从杭州到达该城市的价格 加上 idx城市转机的价格 低于 从杭州到达idx城市的价格 则更新
if(!flag[idx -1 ] && price != NO_AIRPLANE && (cityPrice+ price) < minPrice[idx - 1]){
// 可达的城市到达的
minPrice[idx - 1] = cityPrice+ price;
System.out.println(idx+"更新最优表:" + Arrays.toString(minPrice));
}
}
dijkstra();
} }

  

带你找到五一最省的旅游路线【dijkstra算法代码实现】的更多相关文章

  1. 带你找到五一最省的旅游路线【dijkstra算法推导详解】

    前言 五一快到了,小张准备去旅游了! 查了查到各地的机票 因为今年被扣工资扣得很惨,小张手头不是很宽裕,必须精打细算.他想弄清去各个城市的最低开销. [嗯,不用考虑回来的开销.小张准备找警察叔叔说自己 ...

  2. 「LibreOJ NOIP Round #1」旅游路线

    Description T 城是一个旅游城市,具有 nnn 个景点和 mmm 条道路,所有景点编号为 1,2,...,n1,2,...,n1,2,...,n.每条道路连接这 nnn 个景区中的某两个景 ...

  3. 有向网络(带权的有向图)的最短路径Dijkstra算法

    什么是最短路径? 单源最短路径(所谓单源最短路径就是只指定一个顶点,最短路径是指其他顶点和这个顶点之间的路径的权值的最小值) 什么是最短路径问题? 给定一带权图,图中每条边的权值是非负的,代表着两顶点 ...

  4. [算法] Dijkstra算法(带权有向图 最短路径算法)

    一.带权有向图 二.算法原理 1)由于我们的节点是从1-6,所以我们创建的列表或数组都是n+1的长度,index=0的部分不使用,循环范围为1-6(方便计算). 2)循环之前,我们先初始化dis数组和 ...

  5. Delphi 自带的那个 Hand 光标很难看?没关系,一行代码解决问题:

    Delphi 自带的那个 Hand 光标很难看?没关系,一行代码解决问题: Screen.Cursors[crHandPoint] := LoadCursor(0, IDC_HAND);放在主窗体 O ...

  6. [solution]JZOJ-5838 旅游路线

    [solution] JZOJ-5838 旅游路线 Time Limits 1000ms,Memory Limits 128MB 题面 Description GZOI队员们到X镇游玩.X镇是一个很特 ...

  7. 通过 thread dump 分析找到高CPU耗用与内存溢出的Java代码

    http://heylinux.com/archives/1085.html通过 thread dump 分析找到高CPU耗用与内存溢出的Java代码 首先,要感谢我的好朋友 钊花 的经验分享. 相信 ...

  8. JZOJ 5838. 旅游路线 最大子段和

    5838. 旅游路线 Time Limits: 1000 ms  Memory Limits: 131072 KB  Detailed Limits   Goto ProblemSet Descrip ...

  9. [C++]多源最短路径(带权有向图):【Floyd算法(动态规划法)】 VS n*Dijkstra算法(贪心算法)

    1 Floyd算法 1.1 解决问题/提出背景 多源最短路径(带权有向图中,求每一对顶点之间的最短路径) 方案一:弗洛伊德(Floyd算法)算法 算法思想:动态规划法 时间复杂度:O(n^3) 形式上 ...

随机推荐

  1. SSIS 调试和故障排除

    SSIS内置的调试工具是非常完备的,主要是设置断点和查看变量值,这是在Package的设计阶段可以使用的工具,在Package部署到服务器之后,用户还可以使用事件处理程序以实现Package出错的自我 ...

  2. 【SAP HANA】新建表以及操作数据(3)

    账号和数据库都创建好之后,接下来就可以创建表了.来见识一下这个所谓“列式”存储方式的表是长啥样的! 一.可视化新建表 然后输入所需栏位,设置好类型和长度: 上图右上角可以看到类型是Column Sto ...

  3. C#中使用Bogus创建模拟数据

    原文:CREATING SAMPLE DATA FOR C# 作者:Bruno Sonnino 译文:C#中使用Bogus创建模拟数据 译者: Lamond Lu 背景 在我每次写技术类博文的时候,经 ...

  4. Apache Mina -2

    我们可以了解到 mina是个异步通信框架,一般使用场景是服务端开发,长连接.异步通信使用mina是及其方便的.不多说,看例子. 本次mina 使用的例子是使用maven构建的,过程中需要用到的jar包 ...

  5. tomcat部署服务乱码问题

    first:win+R -->输入regedit 打开注册列表HKEY_CURRENT_USER-->Console-->Tomcat-->CodePage修改成十进制6500 ...

  6. C++线程安全日志库-Win32接口实现

    分享一个C++日志库,使用Win32接口编写,而且是线程安全的日志库.比较简单,只有2个文件,容易上手,使用起来也很简单 头文件 如下是日志库的头文件,接口看似很多,但是使用起来最常用的也就那么几个 ...

  7. Android Studio Run项目出现Failure [INSTALL_FAILED_TEST_ONLY]

    同名掘金博文:https://juejin.im/post/5c2e0c496fb9a049a711f09a 运行环境: AS 版 本:Android Studio 3.2.1 手机型号:vivo Y ...

  8. LeetCode二叉树的前序、中序、后序遍历(递归实现)

    本文用递归算法实现二叉树的前序.中序和后序遍历,提供Java版的基本模板,在模板上稍作修改,即可解决LeetCode144. Binary Tree Preorder Traversal(二叉树前序遍 ...

  9. 记ibatis使用动态列查询问题(remapresults)

    今天在项目开发中,遇到了一个问题:使用ibatis 动态查询列时,每次返回的结果列都是第一次查询的结果列,然而控制台执行的SQL语句时包含该结果列的.比如: <select id="g ...

  10. 关于ASL(平均查找长度)的简单总结

    ASL(Average Search Length),即平均查找长度,在查找运算中,由于所费时间在关键字的比较上,所以把平均需要和待查找值比较的关键字次数成为平均查找长度. 它的定义是这样的: 其中n ...