传送门:>HERE<

题意:给出一棵树(带权),要从一个节点C先走到距离它近的一个节点B,再走到A,要求最坏情况下的总路程(即最长)。

解题思路:

  乍一看,A,B,C都没给出,这怎么求?

  不妨设距离C较近的点位A。

  分析发现,无论怎样,A~B是一定要走的。那么如何能让树上任意两点间距离最大呢?不难发现A,B就是该树直径的两个端点。那么只要两遍BFS就好了。

  那么如何让A~C的路程最长呢?注意到A到C相较A到B是较短的。所以好像不怎么好求……但是可以枚举——枚举每个点作为C到A和B的距离,求出较小的那个,并且打擂得到最大值。

Code

  1. /*By QiXingzhi*/
  2. #include <cstdio>
  3. #include <queue>
  4. #include <iostream>
  5. #include <string>
  6. #include <cstring>
  7. #include <algorithm>
  8. #define r read()
  9. #define Max(a,b) (((a)>(b)) ? (a) : (b))
  10. #define Min(a,b) (((a)<(b)) ? (a) : (b))
  11. using namespace std;
  12. typedef long long ll;
  13. #define int ll
  14. const int N = ;
  15. const int INF = ;
  16. inline int read(){
  17. int x = ; int w = ; register int c = getchar();
  18. while(c ^ '-' && (c < '' || c > '')) c = getchar();
  19. if(c == '-') w = -, c = getchar();
  20. while(c >= '' && c <= '') x = (x << ) +(x << ) + c - '', c = getchar();
  21. return x * w;
  22. }
  23. struct Edge{
  24. int to,cost;
  25. };
  26. int n,m,x,y,z,A,B,ans,ans2;
  27. int d[N], d2[N], vis[N];
  28. vector <Edge> G[N];
  29. queue <int> q;
  30. inline void AddEdge(int u, int v, int w){
  31. Edge e;
  32. e.to = v;
  33. e.cost = w;
  34. G[u].push_back(e);
  35. }
  36. inline void BFS(int s){
  37. while(!q.empty()) q.pop();
  38. q.push(s);
  39. d[s] = ;
  40. vis[s] = ;
  41. int cur,sz,v;
  42. while(!q.empty()){
  43. cur = q.front();
  44. q.pop();
  45. sz = G[cur].size();
  46. for(int i = ; i < sz; ++i){
  47. v = G[cur][i].to;
  48. if(!vis[v]){
  49. vis[v] = ;
  50. d[v] = d[cur] + G[cur][i].cost;
  51. q.push(v);
  52. }
  53. }
  54. }
  55. }
  56. inline void BFS2(int s){
  57. while(!q.empty()) q.pop();
  58. q.push(s);
  59. d2[s] = ;
  60. vis[s] = ;
  61. int cur,sz,v;
  62. while(!q.empty()){
  63. cur = q.front();
  64. q.pop();
  65. sz = G[cur].size();
  66. for(int i = ; i < sz; ++i){
  67. v = G[cur][i].to;
  68. if(!vis[v]){
  69. d2[v] = d2[cur] + G[cur][i].cost;
  70. vis[v] = ;
  71. q.push(v);
  72. }
  73. }
  74. }
  75. }
  76. main(){
  77. n = r, m = r;
  78. for(int i = ; i <= m; ++i){
  79. x = r, y = r, z = r;
  80. AddEdge(x, y, z);
  81. AddEdge(y, x, z);
  82. }
  83. BFS();
  84. int __max = -;
  85. for(int i = ; i <= n; ++i){
  86. if(d[i] > __max){
  87. __max = d[i];
  88. A = i;
  89. }
  90. }
  91. ans = __max;
  92. memset(vis,,sizeof(vis));
  93. BFS(A);
  94. __max = -;
  95. for(int i = ; i <= n; ++i){
  96. if(d[i] > __max){
  97. __max = d[i];
  98. B = i;
  99. }
  100. }
  101. ans = __max;
  102. memset(vis,,sizeof(vis));
  103. BFS2(B);
  104. for(int i = ; i <= n; ++i) ans2 = Max(ans2, Min(d[i], d2[i]));
  105. printf("%lld", ans+ans2);
  106. return ;
  107. }

「NOI2003」逃学的小孩的更多相关文章

  1. BZOJ 1509: [NOI2003]逃学的小孩( 树形dp )

    树形dp求出某个点的最长3条链a,b,c(a>=b>=c), 然后以这个点为交点的最优解一定是a+2b+c.好像还有一种做法是求出树的直径然后乱搞... ----------------- ...

  2. 【BZOJ1509】[NOI2003]逃学的小孩 直径

    [BZOJ1509][NOI2003]逃学的小孩 Description Input 第一行是两个整数N(3  N  200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的 ...

  3. [NOI2003]逃学的小孩(树的直径)

    [NOI2003]逃学的小孩 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一听 ...

  4. 洛谷 P4408 逃学的小孩 解题报告

    P4408 [NOI2003]逃学的小孩 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?&q ...

  5. BZOJ 1509[NOI 2003]逃学的小孩 树形dp

    1509: [NOI2003]逃学的小孩 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 995  Solved: 505[Submit][Status][ ...

  6. NOI 2003 逃学的小孩 (树的直径)

    [NOI2003 逃学的小孩] 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一 ...

  7. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  8. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  9. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

随机推荐

  1. 五、xadmin自定义插件2

    以导入插件为例说明: 1.在xadmin-->plugins下面新建excel.py文件 2.新建ListExcelImportPlugin类,继承BaseAdminPlugin from xa ...

  2. Python Revisited Day 04 (控制结构与函数)

    目录 4.1 控制结构 4.1.1 条件分支 4.1.2 循环 4.2 异常处理 4.2.1 捕获与产生异常 4.2.2 自定义异常 4.3 自定义函数 Tips 参数默认值为可变时 危险 4.3.1 ...

  3. C#格式化字符串大全

    C#格式化字符串大全 分类: VS/C#         1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}" ...

  4. echarts使用笔记二:柱子堆叠

    1.多个柱子堆叠效果,多用于各部分占比 app.title = '坐标轴刻度与标签对齐'; option = { title : { //标题 x : 'center', y : 5, text : ...

  5. [转帖]学习关于TTL

    自己简单试了一下在家里与在公司里面服务器的连接: C:\Users\Administrator>tracert oms.inspur.com 通过最多 个跃点跟踪 到 oms.inspur.co ...

  6. mybtis逆向工程实战教程--条件查询

    mabitis逆向工程进行条件查询:

  7. laravel 循环中子元素使用&符号嵌入到父级,经典版

    /**ajax 获取企业名称 * * @param Request $request * * @return \Illuminate\Http\JsonResponse * @author lxw * ...

  8. vue+webpack项目打包后背景图片加载不出来问题解决

    在做VUE +的WebPack脚手架项目打包完成后,在IIS服务器上运行发现项目中的背景图片加载不出来检查项目代码发现是因为CSS文件中,背景图片引用的路径问题;后来通过修改配置文件,问题终于解决了, ...

  9. vue-cli项目开发/生产环境代理实现跨域请求+webpack配置开发/生产环境的接口地址

    一.开发环境中跨域 使用 Vue-cli 创建的项目,开发地址是 localhost:8080,需要访问非本机上的接口http://10.1.0.34:8000/queryRole.不同域名之间的访问 ...

  10. Selenium简单回顾

    一.Selenium介绍 1.Selenium(浏览器自动化测试框架): Selenium 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的 ...