1. 问题描述
  2. 很久以前,T王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。
  3.  
  4. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。
  5.  
  6. JT国重要大臣,他巡查于各大城市之间,体察民情。所以,从一个城市马不停蹄地到另一个城市成了J最常做的事情。他有一个钱袋,用于存放往来城市间的路费。
  7.  
  8. 聪明的J发现,如果不在某个城市停下来修整,在连续行进过程中,他所花的路费与他已走过的距离有关,在走第x千米到第x+1千米这一千米中(x是整数),他花费的路费是x+10这么多。也就是说走1千米花费11,走2千米要花费23
  9.  
  10. J大臣想知道:他从某一个城市出发,中间不休息,到达另一个城市,所有可能花费的路费中最多是多少呢?
  11.  
  12. 输入格式
  13. 输入的第一行包含一个整数n,表示包括首都在内的T王国的城市数
  14.  
  15. 城市从1开始依次编号,1号城市为首都。
  16.  
  17. 接下来n-1行,描述T国的高速路(T国的高速路一定是n-1条)
  18.  
  19. 每行三个整数Pi, Qi, Di,表示城市Pi和城市Qi之间有一条高速路,长度为Di千米。
  20.  
  21. 输出格式
  22. 输出一个整数,表示大臣J最多花费的路费是多少。
  23.  
  24. 样例输入1
  25.  
  26. 样例输出1
  27.  
  28. 输出格式
  29. 大臣J从城市4到城市5要花费135的路费。

记:
第一次写的时候,是从每个结点遍历,从而找到最长路径

然而在测试较大数据时会超时,

在参考过http://blog.csdn.net/rodestillfaraway/article/details/50529769

醒悟到,可以先找到最远点,再从最远点开始遍历寻找最长路径,就可以避免搜索多余的短路径(剪枝)

ps:

关于邻接表的使用,可以参考之前写过的

http://www.cnblogs.com/mind000761/p/8467789.html

示例代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define LEN 10000
  4.  
  5. typedef struct node node_t;
  6. typedef struct node
  7. {
  8. int n; /*下一个结点*/
  9. int v; /*边权值*/
  10. node_t *next;
  11. }node;
  12. typedef node *node_p;
  13.  
  14. int n = ; /*结点*/
  15. int max = ; /*最长路径*/
  16. int vis[LEN]; /*访问标记*/
  17. node_p e[LEN]; /*邻接表*/
  18.  
  19. void add_edge(int x,int y,int v)
  20. {
  21. node *p;
  22. p = (node *)malloc(sizeof(node));
  23. p->n = y;
  24. p->v = v;
  25. p->next = e[x];
  26. e[x] = p;
  27. return ;
  28. }
  29.  
  30. void init()
  31. {
  32. int i;
  33. int x,y,v;
  34. scanf("%d",&n);
  35. //e = (node_p *)malloc(sizeof(node_p)*(n+1));
  36. //vis = (int *)malloc(sizeof(int)*(n+1));
  37. for (i = ; i <= n ; i ++)
  38. {
  39. e[i] = NULL;
  40. }
  41. for (i = ; i < n ; i ++)
  42. {
  43. scanf("%d %d %d",&x,&y,&v);
  44. add_edge(x,y,v);/*无向图,需添加两条边(双向)*/
  45. add_edge(y,x,v);
  46. }
  47. return ;
  48. }
  49.  
  50. void dfs(int x,int len)
  51. {
  52. node *p = e[x];
  53. while (p != NULL)
  54. {
  55. if (!vis[p->n])
  56. {
  57. vis[p->n] = ;
  58. dfs(p->n,len+p->v);
  59. vis[p->n] = ;
  60. }
  61. p = p->next;
  62. }
  63.  
  64. if (len > max)
  65. {
  66. max = len;
  67. n = x;
  68. }
  69.  
  70. return ;
  71. }
  72.  
  73. int main(void)
  74. {
  75. int i;
  76. init();
  77.  
  78. /*第一次找最远端的点*/
  79. vis[] = ;
  80. dfs(,);
  81. vis[] = ;
  82. /*第二次由于是从最远端开始找,可以确保为最长路径*/
  83. max = ;
  84. vis[n] = ;
  85. dfs(n,);
  86.  
  87. n = *max;
  88. if (max == )
  89. {
  90. n ++;
  91. }
  92. else if (max%)
  93. {
  94. n += (max/ + )*max;/*奇数*/
  95. }
  96. else
  97. {
  98. n += (max/)*(max+);/*偶数*/
  99. }
  100.  
  101. printf("%d",n);
  102. return ;
  103. }

PREV-9_蓝桥杯_大臣的旅费的更多相关文章

  1. 蓝桥杯之大臣的旅费(两次dfs)

    Description 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个 ...

  2. ALGO-22_蓝桥杯_算法训练_数的划分(DP)

    问题描述 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序). 例如:n=,k=,下面三种分法被认为是相同的. ,,; ,,; ,,; 问有多少种不同的分法. 输入格式 n,k 输出格式 ...

  3. 蓝桥杯_算法训练_ALGO10_集合运算

    这个题实际上思路是比较简单的,但是需要注意细节问题. 思路:读入数组之后进行排序,然后再求交.并.补集. 首先排序:(使用的是冒泡排序) #include<iostream> using ...

  4. 蓝桥杯_算法训练_Torry的困惑(基本型)

    这个题目就是求质数的乘积,在加一个模,思路比较简单,直接上代码: #include<iostream> using namespace std; bool isPrime(int a) { ...

  5. 蓝桥杯_算法训练_区间k大数查询

    问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m,表示询问个数 ...

  6. ALGO-43_蓝桥杯_算法训练_A+B Problem

    问题描述 输入A,B. 输出A+B. 输入格式 输入包含两个整数A,B,用一个空格分隔. 输出格式 输出一个整数,表示A+B的值. 样例输入 样例输出 数据规模和约定 -,,,<=A,B< ...

  7. ALGO-39_蓝桥杯_算法训练_数组排序去重

    问题描述 输入10个整数组成的序列,要求对其进行升序排序,并去掉重复元素. 输入格式 10个整数. 输出格式 多行输出,每行一个元素. 样例输入 样例输出 解题思路: 若输入的数字存在数组中,剔除,否 ...

  8. ALGO-115_蓝桥杯_算法训练_和为T(枚举)

    问题描述 从一个大小为n的整数集中选取一些元素,使得它们的和等于给定的值T.每个元素限选一次,不能一个都不选. 输入格式 第一行一个正整数n,表示整数集内元素的个数. 第二行n个整数,用空格隔开. 第 ...

  9. ALGO-117_蓝桥杯_算法训练_友好数

    问题描述 有两个整数,如果每个整数的约数和(除了它本身以外)等于对方,我们就称这对数是友好的.例如: 9的约数和有:+= 4的约数和有:+= 所以9和4不是友好的. 220的约数和有: = 284的约 ...

随机推荐

  1. Python之路,第二十篇:Python入门与基础20

    python3  面向对象4 supper 函数 supper(type, obj) 返回绑定超类的实例(要求obj必须为type类型的实例) supper()   返回绑定的超类的实例,等同于(cl ...

  2. ss linux终端配置

    最近ss莫名宕机,懒得重新安装了,就安装了一个非gui版本,安装非gui版本还有一个优点就是在远程服务器的时候可以用proxychains进行终端代理,非常友好实用.下面简单的说一下如何进行终端ss ...

  3. go:基于时间轮定时器方案

    /* * http://blog.csdn.net/yueguanghaidao/article/details/46290539 * 修改内容:为定时器增加类型和参数属性,修改回调函数类型 */ p ...

  4. 快排 - 快速排序算法 (Chinar出品 简单易懂)

    Quicksort 快排的简单讲解 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...

  5. set_uid set_gid stick_bit 软硬链接

    1.set_uid,里面的s权限   即运行一个命令时,普通用户临时拥有root权限 ( 增加和移除s权限 chmod u+s  file_name chmod u-s file_name 大S  和 ...

  6. mysql操作基本命令

    查看索引 : show index from table_name 创建索引:create index index_name on table_name(column_name) 创建唯一索引:cre ...

  7. this语句的用法第一、二点

    1.this是js的一个关键字,指定一个对象然后去代替他. 函数内的this和函数外的this,函数内的this指向行为发生的主体.函数外的this都指向window没有意思. 例题: functio ...

  8. Django--路由控制 ——URL反向解析

    Django--路由控制 本文目录 一 Django中路由的作用 二 简单的路由配置 三 有名分组 四 路由分发 五 反向解析 六 名称空间 七 django2.0版的path 回到目录 一 Djan ...

  9. (18)模型层 -ORM之msql 多表操作(字段的属性)

    数据库表的对应关系 1.一对一   #关联字段写在那张表都可以 PS:只要写OneToOneField就会自动加一个id 2.一对多  #关系确立,关联字段写在多的一方 3.多对多   #多对多的关系 ...

  10. (15)模型层-什么是ORM

    ORM是什么 1.MVC或者MTV框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发 ...