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

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

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

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

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

ps:

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

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

示例代码:

 #include <stdio.h>
#include <stdlib.h>
#define LEN 10000 typedef struct node node_t;
typedef struct node
{
int n; /*下一个结点*/
int v; /*边权值*/
node_t *next;
}node;
typedef node *node_p; int n = ; /*结点*/
int max = ; /*最长路径*/
int vis[LEN]; /*访问标记*/
node_p e[LEN]; /*邻接表*/ void add_edge(int x,int y,int v)
{
node *p;
p = (node *)malloc(sizeof(node));
p->n = y;
p->v = v;
p->next = e[x];
e[x] = p;
return ;
} void init()
{
int i;
int x,y,v;
scanf("%d",&n);
//e = (node_p *)malloc(sizeof(node_p)*(n+1));
//vis = (int *)malloc(sizeof(int)*(n+1));
for (i = ; i <= n ; i ++)
{
e[i] = NULL;
}
for (i = ; i < n ; i ++)
{
scanf("%d %d %d",&x,&y,&v);
add_edge(x,y,v);/*无向图,需添加两条边(双向)*/
add_edge(y,x,v);
}
return ;
} void dfs(int x,int len)
{
node *p = e[x];
while (p != NULL)
{
if (!vis[p->n])
{
vis[p->n] = ;
dfs(p->n,len+p->v);
vis[p->n] = ;
}
p = p->next;
} if (len > max)
{
max = len;
n = x;
} return ;
} int main(void)
{
int i;
init(); /*第一次找最远端的点*/
vis[] = ;
dfs(,);
vis[] = ;
/*第二次由于是从最远端开始找,可以确保为最长路径*/
max = ;
vis[n] = ;
dfs(n,); n = *max;
if (max == )
{
n ++;
}
else if (max%)
{
n += (max/ + )*max;/*奇数*/
}
else
{
n += (max/)*(max+);/*偶数*/
} printf("%d",n);
return ;
}

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. Java中的内部类————以及jdk1.8的lambda表达式

    一.内部类学习导图 1>.静态内部类: 使用static修饰符来修饰内部类,则这个内部类就属于外部类本身,而不属于外部类的某个对象.因此使用static修饰的内部类被称为静态内部类. publi ...

  2. Python用re正则化模块在字符串查找特定字符串

    实验需要,在一个含有几亿个字符的txt文件中查找特定的字符串,首先用re模块进行查找 from time import clock import re start=clock() label_file ...

  3. 利用scrapy下载图片保存到本地

    1.先声明一下,起始位置已经是将所有的图片链接都能到pipelines.py中 2.创建一个类,继承于ImagesPipeline,因此也就需要导入ImagesPipeline from scrapy ...

  4. 20155219&20155224 《信息安全系统设计基础》实验一 开发环境的熟悉

    实验内容 实验两人一组,最多三人一组 可以使用自己的笔记本,也可以使用实验室台式机 使用实验箱作为超级终端. 实验中学到的知识点 交叉编译 宿主机与目标机 NFS 超级终端 file命令 实验步骤 实 ...

  5. 动态规划-----hdu 1024 (区间连续和)

    给定一个长度为n的区间:求m段连续子区间的和 最大值(其中m段子区间互不相交) 思路: dp[i][j]: 前j个元素i个连续区间最大值 (重要 a[j]必须在最后一个区间内) 转移方程:dp[i][ ...

  6. {"errcode":48001,"errmsg":"api unauthorized}

    微信公众号基础知识说明 网页授权获取微信用户信息:两种 scope 域 https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&am ...

  7. C++学习(二十二)(C语言部分)之 项目扫雷实例

    一.新建项目 二.新建源文件 main.cpp和mining,cpp 三.新建头文件 mining.h 四.图片资源添加 添加完成后会在头文件里面生成一个.h头文件,用来调用资源 打开之后可以看到,对 ...

  8. ACM-ICPC 2018 徐州赛区网络预赛(9.9)

    #include<bits/stdc++.h> #define int long long using namespace std; ; ; ]; int quick(int a,int ...

  9. Python3实现生成验证码图片

    import randomfrom PIL import Image, ImageFont, ImageDrawfrom io import BytesIOfrom ttt import settin ...

  10. 【MAC】常用方法-持续更新

    1.Homebrew安装 删除brew ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ma ...