题目链接

bzoj3124: [Sdoi2013]直径

题解

发现所有直径都经过的边

一定在一条直径上,并且是连续的

在一条直径上找这段区间的两个就好了

代码

  1. #include<map>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define gc getchar()
  6. #define pc putchar
  7. #define int long long
  8. inline int read() {
  9. int x = 0,f = 1;
  10. char c = gc;
  11. while(c < '0' || c > '9') { if(c == '-') f =- 1;c = gc;}
  12. while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = gc;
  13. return x * f;
  14. }
  15. void print(int x) {
  16. if(x < 0) {
  17. pc('-');
  18. x = -x;
  19. }
  20. if(x >= 10) print(x / 10);
  21. pc(x % 10 + '0');
  22. }
  23. int n;
  24. const int maxn = 400007;
  25. struct node {
  26. int v,w,next;
  27. } edge[maxn << 1];
  28. int head[maxn],num = 0;
  29. inline void add_edge(int u,int v,int w) {
  30. edge[++ num].v = v; edge[num].w = w; edge[num].next = head[u]; head[u] = num;
  31. }
  32. int st,mx,dis[maxn],fa[maxn];
  33. void dfs(int x,int Fa) {
  34. if(dis[x] > mx) {
  35. mx = dis[x]; st = x;
  36. }
  37. fa[x] = Fa;
  38. for(int i = head[x];i;i = edge[i].next) {
  39. int v = edge[i].v;
  40. if(v == Fa) continue;
  41. dis[v] = dis[x] + edge[i].w;
  42. dfs(v,x);
  43. }
  44. }
  45. int chain[maxn];
  46. int rdis[maxn],MX;
  47. bool vis[maxn];
  48. void rdfs(int x,int Fa) {
  49. vis[x] = true;
  50. MX = std::max(MX,rdis[x]);
  51. for(int i = head[x];i;i = edge[i].next) {
  52. int v = edge[i].v;
  53. if(vis[v] || v == Fa) continue;
  54. rdis[v] = rdis[x] + edge[i].w;
  55. rdfs(v,x);
  56. }
  57. }
  58. main() {
  59. //freopen("3.in","r",stdin);
  60. n = read();
  61. for(int u,v,w,i = 1;i < n;++ i) {
  62. u = read(),v = read(),w = read();
  63. add_edge(u,v,w);
  64. add_edge(v,u,w);
  65. }
  66. dfs(1,0);
  67. dis[st] = 0;
  68. mx = 0;
  69. dfs(st,0);
  70. int len = 0;
  71. while(st) {
  72. chain[++ len] = st;
  73. vis[st] = true;
  74. st = fa[st];
  75. }
  76. int l = len,r = 1;
  77. for(int i = len;i >= 1;-- i) {
  78. MX = 0;
  79. rdfs(chain[i],0);
  80. if(!MX) continue;
  81. if(MX == dis[chain[i]]) l = i;
  82. if(MX == mx - dis[chain[i]]) {r = i;break;}
  83. }
  84. print(mx);
  85. pc('\n');
  86. print(l - r);
  87. }
  88. /*
  89. 6
  90. 3 1 1000
  91. 1 4 10
  92. 4 2 100
  93. 4 5 50
  94. 4 6 100
  95. */
  96. 

bzoj3124: [Sdoi2013]直径 树形dp two points的更多相关文章

  1. BZOJ3124: [Sdoi2013]直径 (树形DP)

    题意:给一颗树 第一问求直径 第二问求有多少条边是所有直径都含有的 题解:求直径就不说了 解第二问需要自己摸索出一些性质 任意记录一条直径后 跑这条直径的每一个点  如果以这个点不经过直径能到达最远的 ...

  2. 【BZOJ3124】[Sdoi2013]直径 树形DP(不用结论)

    [BZOJ3124][Sdoi2013]直径 Description 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节 ...

  3. [SDOI2013] 直径 - 树形dp

    对于给定的一棵树,其直径的长度是多少,以及有多少条边满足所有的直径都经过该边. Solution 有点意思 先随便求一条直径(两次DFS即可),不妨设为 \(s,t\),我们知道要求的这些边一定都在这 ...

  4. 2014 Super Training #9 E Destroy --树的直径+树形DP

    原题: ZOJ 3684 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3684 题意: 给你一棵树,树的根是树的中心(到其 ...

  5. 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分

    树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...

  6. [10.12模拟赛] 老大 (二分/树的直径/树形dp)

    [10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...

  7. Codeforces 633F 树的直径/树形DP

    题意:有两个小孩玩游戏,每个小孩可以选择一个起始点,并且下一个选择的点必须和自己选择的上一个点相邻,问两个选的点权和的最大值是多少? 思路:首先这个问题可以转化为求树上两不相交路径的点权和的最大值,对 ...

  8. bzoj千题计划134:bzoj3124: [Sdoi2013]直径

    http://www.lydsy.com/JudgeOnline/problem.php?id=3124 第一问: dfs1.dfs2 dfs2中记录dis[i]表示点i距离最长链左端点的距离 第二问 ...

  9. 2018.11.05 bzoj3124: [Sdoi2013]直径(树形dp)

    传送门 一道sbsbsb树形dpdpdp 第一问直接求树的直径. 考虑第二问问的边肯定在同一条直径上均是连续的. 因此我们将直径记下来. 然后对于直径上的每一个点,dpdpdp出以这个点为根的子树中不 ...

随机推荐

  1. Day049--jQuery的文档操作和事件介绍

    今日内容 DOM操作(CRUD) js中DOM document.createElement('p') appendChild() insertBefore() removeChild() 创建元素 ...

  2. 2019The Preliminary Contest for ICPC China Nanchang National Invitational

    The Preliminary Contest for ICPC China Nanchang National Invitational 题目一览表 考察知识点 I. Max answer 单调栈+ ...

  3. 二、java基本语法

    一.标识符 java对各种变量.方法和类等要素命名时使用的字符序列成为标识符:通俗点,凡是自己可以起名字的地方都叫标识符,都遵守标识符的规则 1.标识符命名规则: 1)标识符由字符.下划线.美元符或数 ...

  4. [物理学与PDEs]第2章第2节 粘性流体力学方程组 2.4 粘性热传导流体动力学方程组

    粘性热传导流体动力学方程组: $$\beex \bea \cfrac{\p \rho}{\p t}+\Div(\rho{\bf u})&=0,\\ \rho \cfrac{\rd {\bf u ...

  5. 【codeforces 765F】Souvenirs

    Description Artsem is on vacation and wants to buy souvenirs for his two teammates. There are n souv ...

  6. JSON 之 SuperObject(11): TSuperTableString、TSuperAvlEntry

    JSON 之 SuperObject(11): TSuperTableString.TSuperAvlEntry - 万一 - 博客园http://www.cnblogs.com/del/archiv ...

  7. python跨网段遍历枚举IP地址(转)

    转载链接:https://blog.csdn.net/u013042248/article/details/53165508 0x01 代码思路: 利用二进制遍历: 1.将IP地址分割,每一块转换为8 ...

  8. MapReduce输出文件名更改

    默认情况下生成的文件名是part-r-00000格式,想要自定义生成输出文件名可以使用org.apache.hadoop.mapreduce.lib.output.MultipleOutputs类用来 ...

  9. 【easy】88. Merge Sorted Array 合并两个有序数组

    合并两个有序的list 把排序好的nums2插入nums1中,假设nums1这个vector的空间永远是够的 思路:倒序!! class Solution { public: void merge(v ...

  10. 关于含RecyclerView的fragment来回切换时页面自动滑动到底部的解决方法

    原因: 在fragment中来回切换时RecyclerView获得了焦点,而RecyclerView的 focusableOnTouchMode属性默认是true,所以在切换时RecyclerView ...