【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题基本都是 ...
随机推荐
- ubuntu18.10 修改MySQL编码为utf-8
首先登陆mysql的交互shell,输入下面的命令查看当前数据库的编码方式 show variables like '%character%'; 从上面可以看出,mysql数据库装上之后初始并不均是u ...
- ztree通过id获取节点对象
var treeObj = $.fn.zTree.getZTreeObj("treeId"); var node = treeObj.getNodeByParam("id ...
- TCP/IP学习笔记11--无线通信: 无线通信的种类, 点对点通信协议
IEEE802委员会主要指定了以下几种分类: PAN: personal aera network; LAN: local area network; WAN: wide aera network ...
- Jenkins+maven+gitlab自动化部署之docker发布sprint boot项目(七)
Jenkins发布docker应用与发布java应用配置基本一致,需要配置Dockerfile及构建的步骤,步骤如下: 1.jenkins主机构建应用为jar包 2.jenkins主机把生产的jar包 ...
- C++_向函数传递对象
向函数传递对象 1. 使用对象作为函数参数 对象可以作为参数传递给函数,其方法与传递其他类型的数据相同. 在向函数传递对象时,是通过传值调用传递给函数的. 因此,函数中对对象的任何修改均不影响调用该函 ...
- C++根据用户输入打印对应的金层塔层数
#include <iostream> #include <Windows.h> using namespace std; int main(void) { int row; ...
- PowerBuilder学习笔记之导入Excel数据
原文地址:http://blog.chinaunix.net/uid-20586802-id-3235549.html /*****************简单的导入功能,涉及到数据类型判断***** ...
- PB笔记之数据窗口添加虚拟列的方法
1.选择计算域控件: 2.输入公式 3.添加一个输入框作为列名,注意Name必须改为后缀为_t(PB固定识别_t)才可以绑定输入框和计算域作为虚拟列,虚拟列在最后一列时,有可能不能改变宽度,需往前挪才 ...
- Docker 方式部署的应用的版本更新
前言 公司使用 Docker-Compose 的方式部署 Jenkins/Gitlab/Sonar/Confluence/Apollo/Harbor/ELK/MySQL 等一系列开发工具/数据库. 而 ...
- Docker 学习笔记(二):Dockerfile 定制镜像
镜像的定制实际上就是定制每一层所添加的配置.文件. 如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么之前提及的无法重复的问题.镜像构建透明性的问题.体积 ...