Floyd弗洛伊德算法
先看懂如何使用
用Java实现一个地铁票价计算程序
String station = "A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18 B1 B2 B3 B4 B5 T1 B6 B7 B8 B9 B10 T2 B11 B12 B13 B14 B15";
思路:step1: 设计为A1-A18, T1,T2,B1-B15个点
step2:35个点做为arr[35][35],将相邻的点A1-A2 ...赋值为1, T1和左右两点复制为1,
自己_自己复制为0,
不相邻值为1000(代表无穷大),A18_B1复制为1000
step 3
//Floyd算法求解
for(int k=0; k<length; k++){
for(int i=0; i<length; i++) {
for(int j=0; j<length; j++) {
if((arr[i][k] + arr[k][j]) < arr[i][j]) {
arr[i][j] = arr[i][k] + arr[k][j];
}
}
}
}
package com.train; import java.lang.reflect.Array;
import java.util.HashMap;
import java.util.Scanner;
import java.util.concurrent.ForkJoinPool; public class TrainDemo {
public static void main(String[] args) { String station = "A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18 B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14 B15";
String[] stationarr = station.split("\\s{1,}"); //length=37
HashMap<String, Integer> uniMap = new HashMap<>();
for (int i = 0; i < stationarr.length; i++) { uniMap.put(stationarr[i], i);
}
//distanceMap.put("T1")
System.out.println(uniMap.toString());
//创造一个2维数组,twoarr
// 不能访问的值为@@无穷大
//自己和自己直接为0;
// Integer[][] twoarr = new Integer[stationarr.length][stationarr.length];
for (int i = 0; i < stationarr.length; i++) {
for (int j = 0; j < stationarr.length; j++) {
if (i == j) {
twoarr[i][j] = 0;
} else {
twoarr[i][j] = 1000;
}
}
} for (int i = 0; i <stationarr.length-1 ; i++) {
twoarr[i][i+1]=1;
twoarr[i+1][i]=1;
}
//将能能到达的两点间设置为具体值
// twoarr[uniMap.get("A18").intValue()][uniMap.get("B1").intValue()]=1;
twoarr[9][9]=0;
twoarr[14][14]=0;
twoarr[9][14]=0;
twoarr[14][9]=0;
//相通
twoarr[9][24]=1;
twoarr[24][9]=1;
twoarr[9][25]=1;
twoarr[25][9]=1;
twoarr[14][29]=1;
twoarr[29][14]=1;
twoarr[14][30]=1;
twoarr[30][14]=1;
twoarr[uniMap.get("A18")][uniMap.get("B1")] = 1000;
twoarr[uniMap.get("B1")][uniMap.get("A18")] = 1000;
//t1=9 t2=14
//arr[stationMap.get("A1").intValue()][stationMap.get("A18").intValue()] = 1;
for (int k = 0; k < 35; k++) { for (int i = 0; i <stationarr.length ; i++) {
for (int j = 0; j <stationarr.length ; j++) { if(twoarr[i][k]+twoarr[k][j]<twoarr[i][j]){
twoarr[i][j] = twoarr[i][k] + twoarr[k][j];
}
}
}
}
for (int i = 0; i < 35; i++) {
for (int j = 0; j <35 ; j++) {
System.out.print(twoarr[i][j]+" ");
}
System.out.println(); }
while (true){ String s = new Scanner(System.in).nextLine();
String[] sarr= s.split("\\s{1,}");
System.out.println(twoarr[uniMap.get(sarr[0])][uniMap.get(sarr[1])]);
}
}
}
atzhang
Floyd弗洛伊德算法的更多相关文章
- 经典问题----最短路径(Floyd弗洛伊德算法)(HDU2066)
问题简介: 给定T条路,S个起点,D个终点,求最短的起点到终点的距离. 思路简介: 弗洛伊德算法即先以a作为中转点,再以a.b作为中转点,直到所有的点都做过中转点,求得所有点到其他点的最短路径,Flo ...
- Floyd(弗洛伊德)算法(C语言)
转载:https://blog.csdn.net/qq_35644234/article/details/60875818 Floyd算法的介绍 算法的特点 弗洛伊德算法是解决任意两点间的最短路径的一 ...
- Floyd算法(弗洛伊德算法)
算法描述: Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按 ...
- 弗洛伊德算法(Floyd算法)
原博来自http://www.cnblogs.com/skywang12345/ 弗洛伊德算法介绍 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的 ...
- 弗洛伊德算法(Floyd )
package com.rao.graph; /** * @author Srao * @className Floyd * @date 2019/12/11 18:43 * @package com ...
- 数据结构C语言版 弗洛伊德算法实现
/* 数据结构C语言版 弗洛伊德算法 P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...
- [从今天开始修炼数据结构]图的最短路径 —— 迪杰斯特拉算法和弗洛伊德算法的详解与Java实现
在网图和非网图中,最短路径的含义不同.非网图中边上没有权值,所谓的最短路径,其实就是两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,我们称路径上第 ...
- Floyd最短路径算法
看完这篇文章写的小程序,Floyd最短路径算法,求从一个点到另一个点的最短距离,中间可以经过其他任意个点.三个for循环,从i到j依次经过k的最短距离,最外层for循环是经过点K,内部两个循环是从i( ...
- 弗洛伊德算法Floyed(求各顶点间最短路径):可打印最短路径
#include <iostream> #include <string> #include <iomanip> using namespace std; #def ...
随机推荐
- spring + spring mvc + tomcat 面试题(史上最全)
文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...
- 有了Java8的“+”真的可以不要StringBuilder了吗
最近在头条上看到一篇帖子,说Java8开始,字符串拼接时,"+"会被编译成StringBuilder,所以,字符串的连接操作不用再考虑效率问题了,事实真的是这样吗?要搞明白,还是要 ...
- WEB安全新玩法 [1] 业务安全动态加固平台
近年来,信息安全体系建设趋于完善,以注入攻击.跨站攻击等为代表的传统 Web 应用层攻击很大程度上得到了缓解.但是,Web 应用的业务功能日益丰富.在线交易活动愈加频繁,新的安全问题也随之呈现:基于 ...
- 【题解】10-19秀秀的森林(forest)
我恨秀秀倍增LCA+离线 (时光倒流) 题目 秀秀有一棵带n个顶点的树T,每个节点有一个点权ai-.有一天,她想拥有两棵树,于是她从T中删去了一条边.第二天,她认为三棵树或许会更好一些.因此,她又从她 ...
- Python 机器学习实战 —— 监督学习(下)
前言 近年来AI人工智能成为社会发展趋势,在IT行业引起一波热潮,有关机器学习.深度学习.神经网络等文章多不胜数.从智能家居.自动驾驶.无人机.智能机器人到人造卫星.安防军备,无论是国家级军事设备还是 ...
- c#根据名称反射对应的枚举类型
今天遇到了要配置串口的停止位,这个时候直接反射枚举比较方便. 第一反射所有的枚举值 FieldInfo[] fieldInfoes= typeof(StopBits).GetFields(Bindin ...
- 生成工作区设置文件settings.json
先Ctrl+Shift+P,然后输入setting搜索 找到工作区设置(工作区,仅在当前打开的界面下生效,文档位置与根目录/.vscode/setting.json(可自己创建,也可不创建)) 选择之 ...
- Android开发万能Utils(工具大全)
AndroidUtils Android开发不得不收藏的Utils About AndroidUtilCode 是一个强大易用的安卓工具类库,它合理地封装了安卓开发中常用的函数,具有完善的 Demo ...
- python使用venv
venv模块支持使用自己的站点目录创建轻量级"虚拟环境",可选择与系统站点目录隔离.每个虚拟环境都有自己的Python二进制文件(与用于创建此环境的二进制文件的版本相匹配),并且可 ...
- kafka高性能吞吐原因
1. 简单回顾 Kafka作为时下最流行的开源消息系统,被广泛地应用在数据缓冲.异步通信.汇集日志.系统解耦等方面.相比较于RocketMQ等其他常见消息系统,Kafka在保障了大部分功能特性的同时, ...