问题描述

  小明和小芳出去乡村玩,小明负责开车,小芳来导航。
  小芳将可能的道路分为大道和小道。大道比较好走,每走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结点的最短路数值。
(有问题。。)

代码实现

  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.Iterator;
  4. import java.util.LinkedList;
  5. import java.util.List;
  6. import java.util.Scanner;
  7.  
  8. public class Main {
  9. private static int n;
  10. private final static int MAX = Integer.MAX_VALUE;
  11. private static boolean[] finalVex;
  12. private static int[] shortPath;
  13. private static List<LinkedList<Edge>> list;
  14.  
  15. public static void shortPathDij() {
  16. Edge tmp = null;
  17. shortPath = new int[n];
  18. int[] tails = new int[n];
  19. int[] exp = new int[n];
  20. finalVex = new boolean[n];
  21. Arrays.fill(shortPath, MAX);
  22. Arrays.fill(finalVex, false);
  23. Arrays.fill(exp, 0);
  24.  
  25. shortPath[0] = 0;
  26. tails[0] = 1;
  27. while(!finalVex[n-1]) {
  28. int index = min(shortPath);
  29. if(index == -1)
  30. break;
  31. LinkedList<Edge> p = list.get(index);
  32. Iterator<Edge> it = p.iterator();
  33. int j=0;
  34. while(it.hasNext()) {
  35. tmp = it.next();
  36. j = tmp.end;
  37. if(finalVex[j])
  38. continue;
  39. if(tmp.type==1) {
  40. int eee = exp[index]+tmp.weight;
  41. int sum = shortPath[index]-(int)Math.pow(exp[index], 2)+(int)Math.pow(eee, 2);
  42. if(sum<shortPath[j]) {
  43. shortPath[j] = sum;
  44. tails[j] = index+1;
  45. exp[j] = eee;
  46. }
  47. } else {
  48. if((shortPath[index]+tmp.weight)<shortPath[j]) {
  49. shortPath[j] = shortPath[index]+tmp.weight;
  50. tails[j] = index+1;
  51. exp[j] = 0;
  52. }
  53. }
  54. }
  55. }
  56. }
  57. private static int min(int[] arr) {
  58. int index = -1;
  59. for(int i=0; i<n; i++)
  60. if(!finalVex[i])
  61. index = i;
  62. if(index==-1)
  63. return -1;
  64. for(int i=0; i<arr.length; i++)
  65. if(arr[index]>arr[i]&&!finalVex[i])
  66. index = i;
  67. finalVex[index] = true;
  68. return index;
  69. }
  70.  
  71. public static void main(String[] args) {
  72. Scanner in = new Scanner(System.in);
  73. n = in.nextInt();
  74. int nums = in.nextInt();
  75. list = new ArrayList<>(n);
  76. for(int i=0; i<n; i++) {
  77. list.add(new LinkedList<Edge>());
  78. }
  79. for(int i=0; i<nums; i++) {
  80. int type = in.nextInt();
  81. int start = in.nextInt();
  82. int end = in.nextInt();
  83. int weight = in.nextInt();
  84. list.get(start-1).add(new Edge(type, start-1, end-1, weight));
  85. list.get(end-1).add(new Edge(type, end-1, start-1, weight));
  86. }
  87. shortPathDij();
  88. System.out.println(shortPath[n-1]);
  89. in.close();
  90. }
  91. }
  92.  
  93. class Edge{
  94. public int type;
  95. public int start;
  96. public int end;
  97. public int weight;
  98. public Edge(int type, int start, int end, int weight) {
  99. this.type = type;
  100. this.start = start;
  101. this.end = end;
  102. this.weight = weight;
  103. }
  104.  
  105. }

【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. ubuntu18.10 修改MySQL编码为utf-8

    首先登陆mysql的交互shell,输入下面的命令查看当前数据库的编码方式 show variables like '%character%'; 从上面可以看出,mysql数据库装上之后初始并不均是u ...

  2. ztree通过id获取节点对象

    var treeObj = $.fn.zTree.getZTreeObj("treeId"); var node = treeObj.getNodeByParam("id ...

  3. TCP/IP学习笔记11--无线通信: 无线通信的种类, 点对点通信协议

    IEEE802委员会主要指定了以下几种分类: PAN: personal aera network;  LAN: local area network; WAN: wide aera network ...

  4. Jenkins+maven+gitlab自动化部署之docker发布sprint boot项目(七)

    Jenkins发布docker应用与发布java应用配置基本一致,需要配置Dockerfile及构建的步骤,步骤如下: 1.jenkins主机构建应用为jar包 2.jenkins主机把生产的jar包 ...

  5. C++_向函数传递对象

    向函数传递对象 1. 使用对象作为函数参数 对象可以作为参数传递给函数,其方法与传递其他类型的数据相同. 在向函数传递对象时,是通过传值调用传递给函数的. 因此,函数中对对象的任何修改均不影响调用该函 ...

  6. C++根据用户输入打印对应的金层塔层数

    #include <iostream> #include <Windows.h> using namespace std; int main(void) { int row; ...

  7. PowerBuilder学习笔记之导入Excel数据

    原文地址:http://blog.chinaunix.net/uid-20586802-id-3235549.html /*****************简单的导入功能,涉及到数据类型判断***** ...

  8. PB笔记之数据窗口添加虚拟列的方法

    1.选择计算域控件: 2.输入公式 3.添加一个输入框作为列名,注意Name必须改为后缀为_t(PB固定识别_t)才可以绑定输入框和计算域作为虚拟列,虚拟列在最后一列时,有可能不能改变宽度,需往前挪才 ...

  9. Docker 方式部署的应用的版本更新

    前言 公司使用 Docker-Compose 的方式部署 Jenkins/Gitlab/Sonar/Confluence/Apollo/Harbor/ELK/MySQL 等一系列开发工具/数据库. 而 ...

  10. Docker 学习笔记(二):Dockerfile 定制镜像

    镜像的定制实际上就是定制每一层所添加的配置.文件. 如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么之前提及的无法重复的问题.镜像构建透明性的问题.体积 ...