【CCF CSP】 20171203 行车路线 Java(有问题)80分
问题描述
小芳将可能的道路分为大道和小道。大道比较好走,每走1公里小明会增加1的疲劳度。小道不好走,如果连续走小道,小明的疲劳值会快速增加,连续走s公里小明会增加s2的疲劳度。
例如:有5个路口,1号路口到2号路口为小道,2号路口到3号路口为小道,3号路口到4号路口为大道,4号路口到5号路口为小道,相邻路口之间的距离都是2公里。如果小明从1号路口到5号路口,则总疲劳值为(2+2)2+2+22=16+2+4=22。
现在小芳拿到了地图,请帮助她规划一个开车的路线,使得按这个路线开车小明的疲劳度最小。
输入格式
接下来m行描述道路,每行包含四个整数t, a, b, c,表示一条类型为t,连接a与b两个路口,长度为c公里的双向道路。其中t为0表示大道,t为1表示小道。保证1号路口和n号路口是连通的。
输出格式
样例输入
1 1 2 3
1 2 3 2
0 1 3 30
0 3 4 20
0 4 5 30
1 3 5 6
1 5 6 1
样例输出
样例说明
对于另外20%的评测用例,不存在小道;
对于另外20%的评测用例,所有的小道不相交;
对于所有评测用例,1 ≤ n ≤ 500,1 ≤ m ≤ 105,1 ≤ a, b ≤ n,t是0或1,当t为0时c ≤ 105,当t为1时c≤ 80。保证答案不超过106。
解题思路
代码实现
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner; public class Main {
private static int n;
private final static int MAX = Integer.MAX_VALUE;
private static boolean[] finalVex;
private static int[] shortPath;
private static List<LinkedList<Edge>> list; public static void shortPathDij() {
Edge tmp = null;
shortPath = new int[n];
int[] tails = new int[n];
int[] exp = new int[n];
finalVex = new boolean[n];
Arrays.fill(shortPath, MAX);
Arrays.fill(finalVex, false);
Arrays.fill(exp, 0); shortPath[0] = 0;
tails[0] = 1;
while(!finalVex[n-1]) {
int index = min(shortPath);
if(index == -1)
break;
LinkedList<Edge> p = list.get(index);
Iterator<Edge> it = p.iterator();
int j=0;
while(it.hasNext()) {
tmp = it.next();
j = tmp.end;
if(finalVex[j])
continue;
if(tmp.type==1) {
int eee = exp[index]+tmp.weight;
int sum = shortPath[index]-(int)Math.pow(exp[index], 2)+(int)Math.pow(eee, 2);
if(sum<shortPath[j]) {
shortPath[j] = sum;
tails[j] = index+1;
exp[j] = eee;
}
} else {
if((shortPath[index]+tmp.weight)<shortPath[j]) {
shortPath[j] = shortPath[index]+tmp.weight;
tails[j] = index+1;
exp[j] = 0;
}
}
}
}
}
private static int min(int[] arr) {
int index = -1;
for(int i=0; i<n; i++)
if(!finalVex[i])
index = i;
if(index==-1)
return -1;
for(int i=0; i<arr.length; i++)
if(arr[index]>arr[i]&&!finalVex[i])
index = i;
finalVex[index] = true;
return index;
} public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
int nums = in.nextInt();
list = new ArrayList<>(n);
for(int i=0; i<n; i++) {
list.add(new LinkedList<Edge>());
}
for(int i=0; i<nums; i++) {
int type = in.nextInt();
int start = in.nextInt();
int end = in.nextInt();
int weight = in.nextInt();
list.get(start-1).add(new Edge(type, start-1, end-1, weight));
list.get(end-1).add(new Edge(type, end-1, start-1, weight));
}
shortPathDij();
System.out.println(shortPath[n-1]);
in.close();
}
} class Edge{
public int type;
public int start;
public int end;
public int weight;
public Edge(int type, int start, int end, int weight) {
this.type = type;
this.start = start;
this.end = end;
this.weight = weight;
} }
【CCF CSP】 20171203 行车路线 Java(有问题)80分的更多相关文章
- ccf 201712-4 行车路线(70分)
ccf 201712-4 行车路线 解题思路: 首先Dijkstra是基于贪心算法的,即每一次作出的选择都具有贪心选择性.此题由于有“如果连续走小道,小明的疲劳值会快速增加,连续走s公里小明会增加s2 ...
- ccf 201712-4 行车路线(Python实现)
一.原题 问题描述 试题编号: 201712-4 试题名称: 行车路线 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将 ...
- ccf 行车路线
问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如果连续走小道,小明的疲劳值会快速增加,连续走s公 ...
- CCF CSP/CCSP报名费优惠的方法以及常见疑问
目录 1. 本文地址 2. 认证作用 2.1. 高校认可 2.2. 赛事认可 2.3. 企业认可 3. 报名费价格及获取优惠的方法 3.1. CCF CSP 3.2. CCF CCSP 4. 语言与I ...
- CCF CSP认证考试在线评测系统
关于 CCF CSP 认证考试在线评测系统 CCF CSP 认证考试简介 CCF 是中国计算机学会的简称.CCF 计算机软件能力认证(简称 CCF CSP 认证考试)是 CCF 于 2014 年推出, ...
- CCF CSP 认证
参加第八次CCF CSP认证记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四 ...
- CCF CSP 201609-2 火车购票
题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...
- CCF CSP 201703-3 Markdown
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...
- CCF CSP 201703
CCF CSP 2017·03 做了一段时间的CCF CSP试题,个人感觉是这样分布的 A.B题基本纯暴力可满分 B题留心数据范围 C题是个大模拟,留心即可 D题更倾向于图论?(个人做到的D题基本都是 ...
随机推荐
- mysql left join 右表数据不唯一的情况解决方法
mysql left join 右表数据不唯一的情况解决方法 <pre>member 表id username1 fdipzone2 terry member_login_log 表id ...
- 利用sourceinsight宏(Quicker.em)提高编码效率和质量
利用sourceinsight宏(Quicker.em)提高编码效率和质量Marco是sourceinsight软件一个强大的功能,用户可以通过编写宏来实现自定义功能.这里有个比较流行的宏文件quic ...
- 【转帖】如果进入CPU的世界,时间会是怎样的?
如果进入CPU的世界,时间会是怎样的? 2018-02-26 20:52:46 world6 阅读数 1295更多 分类专栏: 网络 缓存服务 架构 版权声明:本文为博主原创文章,遵循CC 4.0 ...
- TypeScript 高级类型 类(class)
传统的JavaScript程序使用函数和基于原型的继承来创建可重用的组件,但对于熟悉使用面向对象方式的程序员来讲就有些棘手,因为他们用的是基于类的继承并且对象是由类构建出来的. 从ECMAScript ...
- 打jar包在linux上执行
1.jar包插件 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>ma ...
- fpga基础
1.FPGA 的分类: 根据 FPGA 基本结构,可将其分为基于乘积项(Product-Term)技术的 FPGA 和基于查找表(Look-Up-Table)技术的 FPGA 两种. (1)基于乘积项 ...
- MySQL新项目如何确保上线安全
大纲 DBA最应该做的事情 新项目开发环境应该注意什么 功能测试和压力测试MySQL DBA关注点 线上环境关注点 业务在大压力情况下,MySQL如何能活下来 DBA最应该做的事情 备份 建议每天全备 ...
- PowerBuilder学习笔记之根据新PBL文件替换pbd文件的方法
在程序目录上右键,选择Build Runtime Library 在Build Runtime Library 页面点击OK,注意,会将全部的文件重新编译
- java 读取文件流
搬运自速学堂:https://www.sxt.cn/Java_jQuery_in_action/ten-iqtechnology.html JAVA中IO流体系: 四大IO抽象类 ·InputStre ...
- [v]Linux下安装Git
Ubuntu12.04中默认没有安装Git.需要自行安装. 1. 安装Git 1.1 Ubuntu12.04下 可以使用apt-get方式安装,也可以下载源代码安装[1],我们这里使用apt-git安 ...