这个题主要考察对树的操作,主要思想是DFS或者BFS,其次是找树的直径方法(既要运用两次BFS/DFS),最后作为小白,还练习了vector的操作。

DFS框架伪码:

  1. bool DSF(Node oneTreePoint ){ //传入的结点和其他有效信息
  2. visited[nowPoint] = ; //当前点已遍历标记
  3. 相关操作(随题更改)for( AllLinkNode){//遍历与此点相连的所有节点;
  4. if ( !visited[oneLinkNode] ){ //如果没有被访问过才能继续搜索;
  5. visited[onelinkedNode] = ; //标记已访问;
  6.    相关操作(随题更改)
  7. DSF( Node oneTreePoint);
  8. }
  9. }
  10. if(触底判断条件){
         执行操作;
  11. return true;
  12. }
  13. return true;
  14. }

vector的操作:

  1. //建立一个vector数组,每个Vector中存放结构体数据类型;
  2.  
  3. struct LinkNode{
  4. int linkedPoint;
  5. int length;
  6. };
  7. vector <LinkNode> Tree[MAX];
  8.  
  9. //对vector数组清空
  10. for(int i = ;i < MAX;i++)
  11. Tree[i].clear();
  12.  
  13. //插入
  14. Tree[i].push_back( LinkNode n );

大意是给一个树,每个边的权重已知,求树的直径。

After a long time of algorithm training, we want to hold a running contest in our beautiful campus. Because all of us are curious about a coders's fierce athletic contest,so we would like a more longer athletic track so that our contest can last more .

In this problem, you can think our campus consists of some vertexes connected by roads which are undirected and make no circles, all pairs of the vertexes in our campus are connected by roads directly or indirectly, so it seems like a tree, ha ha.

We need you write a program to find out the longest athletic track in our campus. our athletic track may consist of several roads but it can't use one road more than once.

Input

*Line 1: A single integer: T represent the case number T <= 10
For each case
*Line1: N the number of vertexes in our campus 10 <= N <= 2000
*Line2~N three integers a, b, c represent there is a road between vertex a and vertex b with c meters long
1<= a,b <= N,  1<= c <= 1000;

Output

For each case only one integer represent the longest athletic track's length

Sample Input

  1. 1
  2. 7
  3. 1 2 20
  4. 2 3 10
  5. 2 4 20
  6. 4 5 10
  7. 5 6 10
  8. 4 7 40

Sample Output

  1. 80
  2.  
  1. /*
  2. * 3517_The longest athletic track.cpp
  3. * 给定一个边长带有权值的树,求树的直径。
  4. * Created on: 2018年11月8日
  5. * Author: Jeason
  6. */
  7. #include <iostream>
  8. #include <fstream>
  9. #include <string>
  10. #include <cstring>
  11. #include <vector>
  12. using namespace std;
  13. #define MAX 2001
  14.  
  15. struct LinkNode{
  16. int linkedPoint;
  17. int length;
  18. };
  19.  
  20. int findMaxLength[MAX];
  21. int findMaxPoint[MAX];
  22. int numofMax;
  23. int visited[MAX];
  24. int start = ;
  25. vector <LinkNode> Tree[MAX];
  26.  
  27. bool DSF(vector <LinkNode> oneTreePoint ,int totalLength ,int nowPoint ){
  28. visited[nowPoint] = ;
  29. int tmp = totalLength;
  30. for(int i = ; i < oneTreePoint.size(); i++){//遍历与此点相连的所有节点;
  31. if ( !visited[oneTreePoint[i].linkedPoint] ){ //如果没有被访问过才能继续搜索;
  32. visited[oneTreePoint[i].linkedPoint] = ; //标记已访问;
  33.  
  34. totalLength = tmp + oneTreePoint[i].length; //如果为符合条件点,更新当前总长;
  35. // cout << "当前点" << nowPoint << " 和 " << oneTreePoint[i].linkedPoint << "长度为" << totalLength << endl;
  36. DSF( Tree[ oneTreePoint[i].linkedPoint ], totalLength, oneTreePoint[i].linkedPoint);
  37. }
  38. }
  39.  
  40. if(oneTreePoint.size() == ){
  41. //说明找到了边缘的子叶,执行操作;
  42. findMaxLength[start] = totalLength; //记录当前总长度;
  43. findMaxPoint[start] = nowPoint; //总长度对应的点;
  44. start++;
  45. // cout << "get bottom:"<< findMaxLength[start-1] <<endl;
  46. return true;
  47. }
  48.  
  49. // cout << "finsh at:"<< nowPoint << endl;
  50.  
  51. return true;
  52. }
  53.  
  54. int find(int findMax[MAX])
  55. {
  56. int m = ;
  57. for( int i = ; i <= MAX; i++ )
  58. if( findMax[i] > findMax[m])
  59. m = i;
  60. return m;
  61. }
  62.  
  63. int main()
  64. {
  65. int T,point_num;
  66. int a,b,ab_length;
  67. cin >> T;
  68. while(T--){
  69. //初始化操作
  70. start = ;
  71. numofMax = ;
  72. memset(findMaxLength,,sizeof(findMaxLength));
  73. memset(findMaxPoint,,sizeof(findMaxPoint));
  74. memset(visited,,sizeof(visited));
  75. for(int i = ;i < MAX;i++)
  76. Tree[i].clear();
  77.  
  78. cin >> point_num;
  79. point_num--;
  80. while(point_num--){//将数据存储在树结构中
  81. cin >> a >> b >> ab_length;
  82. LinkNode point1;
  83. point1.linkedPoint = b;
  84. point1.length = ab_length;
  85. Tree[a].push_back( point1 );
  86. LinkNode point2;
  87. point2.linkedPoint = a;
  88. point2.length = ab_length;
  89. Tree[b].push_back( point2 );
  90. }
  91. DSF(Tree[], , ); //从编号为1的结点开始DSF;
  92. numofMax = find(findMaxLength);
  93. // cout << "第1次结束" << ",,离2最远的点:"<< findMaxPoint[numofMax] << ";其长度:"<< findMaxLength[numofMax] <<endl;
  94.  
  95. int tempPoint = findMaxPoint[numofMax];
  96. memset(findMaxLength,,sizeof(findMaxLength));
  97. memset(findMaxPoint,,sizeof(findMaxPoint));
  98. memset(visited,,sizeof(visited));
  99.  
  100. DSF(Tree[tempPoint], , tempPoint );
  101. numofMax = find(findMaxLength);
  102. // cout << "第2次结束,离" << findMaxPoint[numofMax] << "最远的点:"<< findMaxPoint[numofMax] << ";其长度:"<< findMaxLength[numofMax] <<endl;
  103. cout << findMaxLength[numofMax] << endl;
  104. }
  105.  
  106. }

深度优先搜索(DFS)----------------Tju_Oj_3517The longest athletic track的更多相关文章

  1. 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)

    深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...

  2. 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)

    需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...

  3. 深度优先搜索DFS和广度优先搜索BFS简单解析

    转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...

  4. TOJ 3517 The longest athletic track

    3517.   The longest athletic track Time Limit: 1.0 Seconds   Memory Limit: 65536KTotal Runs: 880   A ...

  5. 【算法入门】深度优先搜索(DFS)

    深度优先搜索(DFS) [算法入门] 1.前言深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解 ...

  6. 深度优先搜索 DFS 学习笔记

    深度优先搜索 学习笔记 引入 深度优先搜索 DFS 是图论中最基础,最重要的算法之一.DFS 是一种盲目搜寻法,也就是在每个点 \(u\) 上,任选一条边 DFS,直到回溯到 \(u\) 时才选择别的 ...

  7. 算法与数据结构基础 - 深度优先搜索(DFS)

    DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...

  8. 深度优先搜索(DFS)

    [算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一 ...

  9. 算法总结—深度优先搜索DFS

    深度优先搜索(DFS) 往往利用递归函数实现(隐式地使用栈). 深度优先从最开始的状态出发,遍历所有可以到达的状态.由此可以对所有的状态进行操作,或列举出所有的状态. 1.poj2386 Lake C ...

随机推荐

  1. 深入理解JAVA虚拟机阅读笔记3——垃圾回收器

    一.垃圾收集器总览 新生代:Serial. ParNew. Parallel Scavenge 老年代:CMS.Serial Old. Parallel Old 最新的:G1 并行和并发的区别: 并行 ...

  2. 用SQL查询方式显示GROUP BY中的TOP解决方法[转]

    用SQL查询方式显示GROUP BY中的TOP怎样用一个SQL语句来显示 分组后每个组的前几位 比如把一个学校所有学生的成绩按班级分组,再显示每个班级前五名的信息. 班级     学生   成绩 一班 ...

  3. UVALive6442_Coins on a Ring

    真正的水题,可惜无法当场机智一下. 这样的,在一个圈圈上给你n个黑点,现在要你移动每一个黑点使得所有的点都是等间距的,每个点中最远需要一定的那个点最小可以是多少? 其实是这样来考虑的,我们可以随便设置 ...

  4. BeautifulSoup的find()和findAll()

    BeautifulSoup的提供了两个超级好用的方法(可能是你用bs方法中最常用的).借助这两个函数,你可以通过表现的不同属性轻松过滤HTML(XML)文件,查找需要的标签组或单个标签. 首先find ...

  5. MT【119】关于恒成立的一道压轴题

    分析:处理恒成立问题,一般先代特殊值缩小范围.令x=0,则f(a)<f(0),容易知a<0. 排除答案C.容易理解a趋向于0时候,是可以的,排除D.在剩余的A,B选项里,显然偏向于A.因为 ...

  6. H5页面遮罩弹框下层还能滚动的问题

    在页面上显示一个遮罩层,这是非常常见的操作,在遮罩层上操作,下层也会默认跟随手指滚动 此处就是要在显示遮罩的时候禁止下层滚动. 首先设置一个全局变量 var canScroll=false; 页面初始 ...

  7. hdu5909 Tree Cutting 【树形dp + FWT】

    题目链接 hdu5909 题解 设\(f[i][j]\)表示以\(i\)为根的子树,\(i\)一定取,剩余节点必须联通,异或和为\(j\)的方案数 初始化\(f[i][val[i]] = 1\) 枚举 ...

  8. BZOJ2142 礼物 【扩展Lucas】

    题目 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多.小E从商店中购买了n件礼物, ...

  9. redis动态扩展内存

    需求:将redis内存从1G扩展到3G,不中断服务 1.打开客户端 # redis-cli -p 6391 2.查看当前值 redis 127.0.0.1:6391> config get ma ...

  10. lumen 使用 dingo API 在 phpunit 中 404 的解决方法, 以及鉴权问题

    1. phpunit.xml 中添加 dingo 相关配置 <env name="API_STANDARDS_TREE" value="x"/> & ...