问题描述

  小明和小芳出去乡村玩,小明负责开车,小芳来导航。
  小芳将可能的道路分为大道和小道。大道比较好走,每走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。
  现在小芳拿到了地图,请帮助她规划一个开车的路线,使得按这个路线开车小明的疲劳度最小。

输入格式

  输入的第一行包含两个整数nm,分别表示路口的数量和道路的数量。路口由1至n编号,小明需要开车从1号路口到n号路口。
  接下来m行描述道路,每行包含四个整数tabc,表示一条类型为t,连接ab两个路口,长度为c公里的双向道路。其中t为0表示大道,t为1表示小道。保证1号路口和n号路口是连通的。

输出格式

  输出一个整数,表示最优路线下小明的疲劳度。

样例输入

6 7
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

样例输出

76

样例说明

  从1走小道到2,再走小道到3,疲劳度为52=25;然后从3走大道经过4到达5,疲劳度为20+30=50;最后从5走小道到6,疲劳度为1。总共为76。
数据规模和约定
  对于30%的评测用例,1 ≤ n ≤ 8,1 ≤ m ≤ 10;
  对于另外20%的评测用例,不存在小道;
  对于另外20%的评测用例,所有的小道不相交;
  对于所有评测用例,1 ≤ n ≤ 500,1 ≤ m ≤ 105,1 ≤ ab ≤ nt是0或1,当t为0时c ≤ 105,当t为1时c≤ 80。保证答案不超过106

解题思路

   使用邻接表存储边,基于迪杰斯特拉算法计算最短的疲劳值。使用一个长度为n的数组记录,某结点之前走的小道的长度。
  在Dijstra中比较更新最短路时,如果迭代到小路时,比较路的长度为((选取结点的最短路)-选取结点之前走的小路的平方+(选取结点之前走的小路长度+本结点选择的小路长度)的平方),如果比较路小于本结点当前最短路,则替换当前最短路,本结点之前走的小路长度记为(选取结点之前走的小路+本次走的小路长度),如果大于等于,不修改,继续迭代;如果迭代到大路,比较路的长度为(选取结点的最短路+本结点选择的大路),如果比较路小于本结点当前最短路,则替换当前最短路,且本结点之前走的最短路记为0,如果大于等于,不修改,继续迭代。直至n结点确定最短路,程序结束,输入n结点的最短路数值。
(有问题。。)

代码实现

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分的更多相关文章

  1. ccf 201712-4 行车路线(70分)

    ccf 201712-4 行车路线 解题思路: 首先Dijkstra是基于贪心算法的,即每一次作出的选择都具有贪心选择性.此题由于有“如果连续走小道,小明的疲劳值会快速增加,连续走s公里小明会增加s2 ...

  2. ccf 201712-4 行车路线(Python实现)

    一.原题 问题描述 试题编号: 201712-4 试题名称: 行车路线 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将 ...

  3. ccf 行车路线

    问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如果连续走小道,小明的疲劳值会快速增加,连续走s公 ...

  4. CCF CSP/CCSP报名费优惠的方法以及常见疑问

    目录 1. 本文地址 2. 认证作用 2.1. 高校认可 2.2. 赛事认可 2.3. 企业认可 3. 报名费价格及获取优惠的方法 3.1. CCF CSP 3.2. CCF CCSP 4. 语言与I ...

  5. CCF CSP认证考试在线评测系统

    关于 CCF CSP 认证考试在线评测系统 CCF CSP 认证考试简介 CCF 是中国计算机学会的简称.CCF 计算机软件能力认证(简称 CCF CSP 认证考试)是 CCF 于 2014 年推出, ...

  6. CCF CSP 认证

    参加第八次CCF CSP认证记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四 ...

  7. CCF CSP 201609-2 火车购票

    题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...

  8. CCF CSP 201703-3 Markdown

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...

  9. CCF CSP 201703

    CCF CSP 2017·03 做了一段时间的CCF CSP试题,个人感觉是这样分布的 A.B题基本纯暴力可满分 B题留心数据范围 C题是个大模拟,留心即可 D题更倾向于图论?(个人做到的D题基本都是 ...

随机推荐

  1. spring springboot websocket 不能注入( @Autowired ) service bean 报 null 错误

    spring 或 springboot 的 websocket 里面使用 @Autowired 注入 service 或 bean 时,报空指针异常,service 为 null(并不是不能被注入). ...

  2. alpine docker exec: "/bin/bash": stat /bin/bash: no such file or directory 解决方案

    sudo docker exec -it 1df4f9732e06 sh

  3. nvidia jetson tx2 刷机遇到的问题解决

    一.主要信息 使用的开发板:nvidia jetson tx2(内存8g有wifi的版本) 使用的JetPack版本: 4.2.2 二.遇到的问题及解决 1. 刷好jetson os 后,开发板一直在 ...

  4. Kibana配置安装

    学习网站 https://discuss.elastic.co https://github.com/elastic 配置 server.port: 5601 server.host: "l ...

  5. Swing的基本操作

    package GUI_experience; import java.awt.*; import java.awt.Container; import java.awt.FlowLayout; im ...

  6. echo、print和print_r的区别

    1.echo 可以输出一个或多个字符串 ,多个以逗号隔开就行 2.print 也可以输出一个或多个字符串 ,多个要用连接符 3.print_r()可以打印数组:对象 bool print_r ( mi ...

  7. 利用Python进行数据分析 第8章 数据规整:聚合、合并和重塑.md

    学习时间:2019/11/03 周日晚上23点半开始,计划1110学完 学习目标:Page218-249,共32页:目标6天学完(按每页20min.每天1小时/每天3页,需10天) 实际反馈:实际XX ...

  8. PAT甲级题分类汇编——线性

    本文为PAT甲级分类汇编系列文章. 线性类,指线性时间复杂度可以完成的题.在1051到1100中,有7道: 题号 标题 分数 大意 时间 1054 The Dominant Color 20 寻找出现 ...

  9. golang开发:环境篇(四)包管理器 glide的使用

    glide 是golang项目开发中是特别重要的软件,没有它,golang的项目可能都无法发布. 为什么要使用glide 平时我们开发Go项目的时候,使用第三方的包的时候都直接使用go get 去获取 ...

  10. MAMP PRO 在osx 10.10 错误处理

    新更新的osx10.10之后,启动MAMP会发现Apache无法启动, 处理如下: 1.cd /Applications/MAMP/Library/bin 2.mv envvars _envvars ...