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. 比如 ...
随机推荐
- VMwarm下安装ubuntu的一些问题
1.终端无法输入中文的原因(未实践) 原文地址 2.Windows10下VMwarm(V15.5)和ubuntu14.04实现复制文件(已经实践) 转载路径
- C#控制操控操作多个UVC摄像头设备
有时,我们需要在C#代码中对多个UVC摄像头进行操作,如何实现呢? 建立基于SharpCamera的项目 首先,请根据之前的一篇博文 点击这里 中的说明,建立基于SharpCamera的摄像头控制项目 ...
- statsvn使用小记
准备工作 1.安装TortoiseSVN,在安装时需要安装svn命令行工具: 2.拉取svn代码: svn co https://svn.myserver.cn/svn/myproject1\trun ...
- vue组件5 组件和v-for指令
使用v-for遍历一个数组的时候,并且给定的数组变化时vue不会重复生成所有的元素,而是智能的找到需要更改的元素,并只改变这些元素 key属性可以告诉vue数组中的每个元素都应该与页面上的哪个元素相关 ...
- Linux 部署 YUM 仓库
本篇主要写了怎么搭建自定义的YUM源,在一个拥有大量本地网络的主机环境中,可以减少对外网的依赖. Server 安装 vsftp 包 [root@server ~]# yum install vsft ...
- ls - 列出目录清单信息
ls - list directory contents 列出目录内容 格式: ls [OPTION]... [FILE]... 常用选项: -a:显示所有文件或目录(包括隐藏目录和.(当前目录),. ...
- 你的Mac还安全吗
MacOS 系统重大安全漏洞:不用密码我也可以玩你的 Macbook Wi-Fi 网络安全保护机制被攻破.Android 泄漏终端设备的用户声音和屏幕活动.iOS 出 bug,Office更是漏洞不断 ...
- 自动化渗透测试工具(Cobalt Strike)3.1 最新破解版
自动化渗透测试工具(Cobalt Strike)3.1 最新破解版[附使用教程] Cobalt Strike是一款专业的自动化渗透测试工具,它是图形化.可视化的,图形界面非常友好,一键傻瓜化使用MSF ...
- Haproxy 反向代理
一.haproxy介绍 HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性.负载均衡,以及基于TCP和HTTP的应用程序代理. 特点如下: .支持两种代理模式:TCP(四层)和H ...
- 图论篇2——最小生成树算法(kurskal算法&prim算法)
基本概念 树(Tree) 如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree) 无向连通图G的一个子图如果是一颗包含G的所有顶点的树,则该子图称为G的生成树. 生成 ...