题目:

代码:

package priv.tzk.lanqiao.ten;

import java.io.IOException;
import java.util.Scanner; public class Main { public static void main(String[] args) { //System.out.println("输入测量点的个数");
Scanner scN = new Scanner(System.in);
int n=scN.nextInt();//坐标个数
int d;//最大长度
int array[][] = new int[n][3];//保存输入的坐标
double [][]Graph = new double[n][n];//保存各个点之间的距离 //将坐标存入二维数组
for(int i=0;i<n;i++) {
//System.out.println("输入第"+i+"个测量点的坐标");
Scanner sc = new Scanner(System.in);
array[i][0]=sc.nextInt();
array[i][1]=sc.nextInt();
array[i][2]=sc.nextInt(); }
//System.out.println("输入两点之间最大距离");
Scanner scD = new Scanner(System.in);
d=scD.nextInt(); //求各个点之间的距离,存入二维数组中,得到图
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
double l=countLong(array[i][0],array[j][0],array[i][1],array[j][1],array[i][2],array[j][2]);
if(l<=d) {
Graph[i][j]=l;
}else {
Graph[i][j]=1000000;
}
}
} //寻找终点,高度最低
int []f=new int[n];//记录终点
double []fl=new double[n];//保存不同终点的最大路径
int min=array[0][2];
//寻找最低点,终点不唯一
for(int i=0;i<n;i++) {
if(min>array[i][2]) {
min=array[i][2];
f[i]=1;//记录最低点的位置
}
} //求两点间最大路径
for(int i=0;i<n;i++) {
if(f[i]==1) {
int vs=0;//题目已知第一个为起点
int vf=i;//终点
try {
double re=dijkstra(vs,vf,Graph);
fl[i]=re;
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
} for(int i=0;i<n;i++) {
double max=fl[0];
if(f[i]==1) {
if(max<fl[i]) {
max=fl[i];
}
}
System.out.println("最大路径为"+max);
} } /*
* 求两点距离
*/
public static double countLong(int x1,int x2,int y1,int y2,int z1,int z2) {
double count=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2);
double re=Math.sqrt(count);
return re;
} /*
* Dijkstra最短路径。
* 即图中"节点vs"到其它各个节点的最短路径。
* @param vs 起始节点
* @param Graph 图
* 将最短路径上的顶点,距离存入泛型集合list,返回
* 注意整型用Integer不能用int
*/
public static double dijkstra(int vs,int vf,double Graph[][]) throws IOException { double re=0; int NUM = Graph[0].length; int[] prenode = new int[NUM];//前驱节点数组 double[] path = new double[NUM];//最短距离数组 boolean[] flag = new boolean[NUM];// 该节点是否已经找到最短路径 int vnear = 0;//距离vs最近的节点 //初始化
for (int i = 0; i <path.length; i++) {
prenode[i] = i;
path[i] = Graph[vs][i];//顶点i的最短路径为顶点vs到i的权
flag[i] = false;
} flag[vs] = true;//vs自身初始化 //遍历 Graph.length-1次,找出每个顶点的最短路径
for (int v = 1; v < Graph.length; v++) {
double min = 100000;
for (int j = 0; j < Graph.length; j++) {
if (!flag[j] && path[j] > min) {
min = path[j];
vnear = j;
}
}
flag[vnear] = true;
for (int k = 0; k < Graph.length; k++) {
if (!flag[k] && (min + Graph[vnear][k]) > path[k]) {
prenode[k] = vnear;
path[k] = min + Graph[vnear][k];
}
}
}
//依次保存前驱,输出
for(int i=0;i<10&&prenode[vf]!=vs;i++) {//i范围根据自己表的情况
re=Graph[prenode[vf]][vf]+re;
vf=prenode[vf];
}
return re;
}
}

运行结果:

注:结果没有验证对错,如果有错,请大神评论指出

2019蓝桥杯Java第十题大学生B组——最短路径思想的更多相关文章

  1. 蓝桥杯java历年真题及答案整理1~20.md

    蓝桥杯java历年真题及答案整理(闭关一个月,呕心沥血整理出来的) 1 算法是这样的,如果给定N个不同字符,将这N个字符全排列,最终的结果将会是N!种.如:给定 A.B.C三个不同的字符,则结果为:A ...

  2. 蓝桥杯Java真题解析

    上个月参加蓝桥杯省赛拿了个省一,自从比赛完之后就一直没怎么写代码了,还有一个多月就要国赛了,从现在开始准备下国赛,但是我也不想学什么算法,而且我还在准备考研,所以就打算只做下历年的真题,争取国赛拿个国 ...

  3. Python解答蓝桥杯省赛真题之从入门到真题(二刷题目一直更新)

    蓝桥刷题 原文链接: https://github.com/libo-sober/LanQiaoCup Python解答蓝桥杯省赛真题之从入门到真题 不同字串 """ 一 ...

  4. 第四届蓝桥杯 c/c++真题

    第四届蓝桥杯 c/c++真题 <1>高斯日记 问题 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们 ...

  5. 蓝桥杯java试题《洗牌》

    问题描述 小弱T在闲暇的时候会和室友打扑克,输的人就要负责洗牌.虽然小弱T不怎么会洗牌,但是他却总是输. 渐渐地小弱T发现了一个规律:只要自己洗牌,自己就一定会输.所以小弱T认为自己洗牌不够均匀,就独 ...

  6. 记 2019蓝桥杯校内预选赛(JAVA组) 赛后总结

    引言 好像博客好久没更新了 哈哈哈哈哈 趁现在有空更新一波 不知道还有没有人看 确实该记录一下每天做了什么了 不然感觉有些浑浑噩噩了 比赛介绍 全称: 蓝桥杯全国软件和信息技术专业人才大赛 蓝桥杯 实 ...

  7. 第八届蓝桥杯java b组第六题

    标题:最大公共子串 最大公共子串长度问题就是:求两个串的所有子串中能够匹配上的最大长度是多少. 比如:"abcdkkk" 和 "baabcdadabc",可以找 ...

  8. 第三届蓝桥杯 c/c++真题

    第三届蓝桥杯真题 c/c++ 以下题目我自己也并不是所有的题目都是一次性就能做对或是有结题思路的.有些题目也是经过查证网上相关的资料或是参考了别人的代码和解题思路才做出来的.总的来看,这份题目考了很多 ...

  9. 【备考06组01号】第四届蓝桥杯JAVA组A组国赛题解

    1.填算式 (1)题目描述     请看下面的算式:     (ABCD - EFGH) * XY = 900     每个字母代表一个0~9的数字,不同字母代表不同数字,首位不能为0.     比如 ...

随机推荐

  1. jQuery基础学习

    一.简介 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨是“Write ...

  2. js如何保留两位小数,并进行四舍五入

    保留两位小数,并进行四舍五入使用js函数 toFixed() 函数传递一个参数(Number) Number就为需要保留小数的位数 具体实现代码 <script language="j ...

  3. flask ajax发送请求返回400

    在flaskWTF使用csrf保护后,一般提交form表单都需要一个隐藏的csrf 这样可以成功提交,但是使用ajax提交时就不能成功提交,会返回400错误,服务器无法理解请求,这样就需要新的方法解决 ...

  4. css实现弹框垂直居中

    原文链接:https://blog.csdn.net/sunny327/article/details/47419949/ <!DOCTYPE html><html> < ...

  5. excel 大文件解析原理实现

    问题 目前的excel 不像之前的excel了可以支持的数据量更大,可以支持支持1048576行,16384列. 之前使用poi读取,直接报错,使用excel 事件的方式读取,还有不少的bug,关键是 ...

  6. Android:异步处理之Handler+Thread的应用

    担心原文消失,做此记录,感谢 https://www.cnblogs.com/net168/p/4075126.html 前言 很久很久以前就听说了,每一个android的应用程序都会分别运行在一个独 ...

  7. Apache/Nginx的web网页访问加密

  8. c语言实现基本的数据结构(五) 单链队列

    #include <stdio.h> #include <tchar.h> #include <stdlib.h> #define MaxQueueSize 100 ...

  9. Matplotlib同时绘制多张图片

    我现在有一组图片,一共100张图片,每张大小是200*200,即imgs.shape=100*200*200*3 (注意通道数在最后一维). 我需要同时绘制这100张图片,而且每张图片需要写上对应的名 ...

  10. MATLAB问题小集合

    1.未定义与 'struct' 类型的输入参数相对应的函数 'tb_optparse' 在运行matlab程序时,出现上述错误. 原因是tb_optparse在common文件夹里面,没在robot文 ...