2019蓝桥杯Java第十题大学生B组——最短路径思想
题目:
代码:
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组——最短路径思想的更多相关文章
- 蓝桥杯java历年真题及答案整理1~20.md
蓝桥杯java历年真题及答案整理(闭关一个月,呕心沥血整理出来的) 1 算法是这样的,如果给定N个不同字符,将这N个字符全排列,最终的结果将会是N!种.如:给定 A.B.C三个不同的字符,则结果为:A ...
- 蓝桥杯Java真题解析
上个月参加蓝桥杯省赛拿了个省一,自从比赛完之后就一直没怎么写代码了,还有一个多月就要国赛了,从现在开始准备下国赛,但是我也不想学什么算法,而且我还在准备考研,所以就打算只做下历年的真题,争取国赛拿个国 ...
- Python解答蓝桥杯省赛真题之从入门到真题(二刷题目一直更新)
蓝桥刷题 原文链接: https://github.com/libo-sober/LanQiaoCup Python解答蓝桥杯省赛真题之从入门到真题 不同字串 """ 一 ...
- 第四届蓝桥杯 c/c++真题
第四届蓝桥杯 c/c++真题 <1>高斯日记 问题 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们 ...
- 蓝桥杯java试题《洗牌》
问题描述 小弱T在闲暇的时候会和室友打扑克,输的人就要负责洗牌.虽然小弱T不怎么会洗牌,但是他却总是输. 渐渐地小弱T发现了一个规律:只要自己洗牌,自己就一定会输.所以小弱T认为自己洗牌不够均匀,就独 ...
- 记 2019蓝桥杯校内预选赛(JAVA组) 赛后总结
引言 好像博客好久没更新了 哈哈哈哈哈 趁现在有空更新一波 不知道还有没有人看 确实该记录一下每天做了什么了 不然感觉有些浑浑噩噩了 比赛介绍 全称: 蓝桥杯全国软件和信息技术专业人才大赛 蓝桥杯 实 ...
- 第八届蓝桥杯java b组第六题
标题:最大公共子串 最大公共子串长度问题就是:求两个串的所有子串中能够匹配上的最大长度是多少. 比如:"abcdkkk" 和 "baabcdadabc",可以找 ...
- 第三届蓝桥杯 c/c++真题
第三届蓝桥杯真题 c/c++ 以下题目我自己也并不是所有的题目都是一次性就能做对或是有结题思路的.有些题目也是经过查证网上相关的资料或是参考了别人的代码和解题思路才做出来的.总的来看,这份题目考了很多 ...
- 【备考06组01号】第四届蓝桥杯JAVA组A组国赛题解
1.填算式 (1)题目描述 请看下面的算式: (ABCD - EFGH) * XY = 900 每个字母代表一个0~9的数字,不同字母代表不同数字,首位不能为0. 比如 ...
随机推荐
- [转]Python实现字符串反转的几种方法
#第一种:使用字符串切片 result = s[::-1] #第二种:使用列表的reverse方法 l = list(s) l.reverse() result = "".join ...
- python基础08--迭代器,生成器
1.1 迭代器 1.可迭代对象:str,list,tuple,set,dict, 迭代器:f(文件),range() 可迭代对象和迭代器都可以for循环 可迭代对象不会计数, 迭代器会计数,上面操作到 ...
- Java之路---Day18(List集合)
2019-11-05-23:03:28 List集合: java.util.List 接口继承自 Collection 接口,是单列集合的一个重要分支,习惯性地会将实现了List 接口的对象称为Lis ...
- 手写Ajax的意义所在,从青铜到钻石!
话说菩提祖师打了孙猴子三板子 然后悟空学会72般变化以及一身神通 对待这个问题作为面试者要思考更加深层次的意义 才更能获得认可 实际上写的ajax 很能看出一个的水平 贴几段代码就可以看出水平的高低 ...
- 【开发笔记】- 在Grails下查看打印真实的SQL
以往我们都是在hibernate里面开启sql,在grails里面只需要在 DataSource.groovy 里面的一个dataSource加入一个 logSql = true即可,但是这样加后发出 ...
- vue数组更新界面无变化
1. vue数组更新界面无变化 1.1. 说明 对数组进行更新或者添加,一定要注意方式,我的情况是数组套数组,双重循环,在造数据的时候,不断从尾部添加数据,所以写成了如下形式,每次下拉都会去加载一批相 ...
- 46、VUE + JS 面试宝典
https://github.com/rohan-paul/Awesome-JavaScript-Interviewshttps://github.com/nieyafei/front-end-int ...
- Socket-网络服务提供的一种机制
网络编程 网络通信的要素 Ip,端口,协议(tcp/udp) 127.0.0.1 本机地址 默认主机名:localhost 端口号:用于标识进程的逻辑地址. 有效端口:0-65535 其中 ...
- 7 静态分析Android
静态分析两种方式: 1. 阅读反汇编的Dalvik字节码:使用IDA 分析dex文件或baksmali反编译的smali文件 2. 阅读反汇编的Java源码:使用dex2jar生成jar文件,用jd- ...
- pandas 之 数据清洗-缺失值
Abstract During the course fo doing data analysis and modeling, a significant amount of time is spen ...