【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题基本都是 ...
随机推荐
- 2019年广东省赛gdccpc回顾
本次比赛状态一般般,热身赛单人挂机爆零让自己慌了一整天. 开题直接抓E题入手,准备交题后关机(辣鸡云桌面),开机后又告诉我要关机,心急连交两发结果都WA了,最后靠队员提醒救了回来.心态还算稳住了.后面 ...
- 虚拟机性能监控与故障处理工具(深入理解java虚拟机三)
JDK自带的工具可以方便的帮助我们处理一些问题,包括查看JVM参数,分析内存变化,查看内存区域,查看线程等信息. 我们熟悉的有java.exe,javac.exe,javap.exe(偶尔用),jps ...
- 关于Python编码这一篇文章就够了
概述 在使用Python或者其他的编程语言,都会多多少少遇到编码错误,处理起来非常痛苦.在Stack Overflow和其他的编程问答网站上,UnicodeDecodeError和UnicodeEnc ...
- CodeForces-166B-Polygons
B. Polygons time limit per test:2 seconds memory limit per test:256 megabytes input:standard input o ...
- ALV报表——基础(一)
目录 一.ALV的简介 二.程序实现 2.1.实现步骤 2.2.代码示例 三.Layout.Fieldcat相关属性,ALV输出函数 3.1.Layout相关属性 3.2.Fieldcat相关属性 3 ...
- Linux踢出登陆用户的正确姿势
首先who(或w)查看需要杀死的终端名,然后执行: pkill -9 -t pts/? pkill相当于ps和kill的结合,用法和killall类似,根据进程名来杀死一类进程(kill是杀死单个) ...
- java 随机生成4位随机数
java 随机生成4位的随机数测试类 @org.junit.Testpublic void testRandom(){ String msg="您的注册码为%s,谢谢注册!"; S ...
- hdu 2132... 被基本问题考住了。。
Problem Description We once did a lot of recursional problem . I think some of them is easy for you ...
- 【转发】Java split()用法
特殊情况有 * ^ : | . \ 一.单个符号作为分隔符 String address="上海\上海市|闵行区\吴中路"; String[] splitAddress=addr ...
- 在论坛中出现的比较难的sql问题:34(递归 获取连续值问题)
原文:在论坛中出现的比较难的sql问题:34(递归 获取连续值问题) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.