树的直径两遍dfs救星了

至于一定在直径中的边数,可以发现这些边一定是连续的(不然你两条直径中间能有空挡?),然后,如果某个点往下有多条直径,那么这条点以下都不算入答案.所以以直径分别两端点为根,找出这样离根最近的点(注意最远的点就是另一个端点),然后找到那两个点的距离就是答案

  1. // luogu-judger-enable-o2
  2. #include<bits/stdc++.h>
  3. #define LL long long
  4. #define il inline
  5. #define re register
  6. #define db double
  7. #define max(a,b) ((a)>(b)?(a):(b))
  8. using namespace std;
  9. const int N=200000+10;
  10. il LL rd()
  11. {
  12. re LL x=0,w=1;re char ch=0;
  13. while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
  14. while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
  15. return x*w;
  16. }
  17. int to[N<<1],nt[N<<1],hd[N],tot=1;
  18. LL w[N<<1],di[N],f[N],lent;
  19. bool v[N];
  20. il void add(int x,int y,LL z)
  21. {
  22. ++tot;to[tot]=y;nt[tot]=hd[x];w[tot]=z;hd[x]=tot;
  23. ++tot;to[tot]=x;nt[tot]=hd[y];w[tot]=z;hd[y]=tot;
  24. }
  25. int n,fa[N];
  26. il int dfs(int x,int ffa)
  27. {
  28. int xx=0;
  29. for(int i=hd[x];i;i=nt[i])
  30. {
  31. int y=to[i];
  32. if(y==ffa) continue;
  33. fa[y]=x,di[y]=di[x]+w[i];
  34. int yy=dfs(y,x);
  35. if(di[xx]<di[yy]) xx=yy;
  36. }
  37. return xx?xx:x;
  38. }
  39. il int dd(int x,int ffa)
  40. {
  41. f[x]=0;
  42. int xx=0,cnt=0;
  43. for(int i=hd[x];i;i=nt[i])
  44. {
  45. int y=to[i];
  46. if(y==ffa) continue;
  47. int yy=dd(y,x);
  48. if(!xx) xx=yy;
  49. f[x]=max(f[x],f[y]+w[i]);
  50. if(di[x]+f[y]+w[i]==lent&&ffa) ++cnt;
  51. }
  52. return (cnt>1&&v[x])?x:xx;
  53. }
  54. int main()
  55. {
  56. int aa,bb,c,d,an=0;
  57. n=rd();
  58. for(int i=1;i<n;i++)
  59. {
  60. int x=rd(),y=rd(),z=rd();
  61. add(x,y,z);
  62. }
  63. aa=1;
  64. di[1]=fa[1]=0;aa=dfs(1,0);
  65. di[aa]=fa[aa]=0;bb=dfs(aa,0);
  66. lent=di[bb];
  67. int now=bb;
  68. while(now) v[now]=true,now=fa[now];
  69. c=dd(aa,0);if(!c) c=bb;
  70. di[bb]=fa[bb]=0,dfs(bb,0);
  71. d=dd(bb,0);if(!d) d=aa;
  72. while(d!=c) ++an,d=fa[d];
  73. printf("%lld\n%d\n",lent,an);
  74. return 0;
  75. }

luogu P3304 [SDOI2013]直径的更多相关文章

  1. [洛谷P3304] [SDOI2013]直径

    洛谷题目链接:[SDOI2013]直径 题目描述 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅 ...

  2. bzoj3124: [Sdoi2013]直径 树形dp two points

    题目链接 bzoj3124: [Sdoi2013]直径 题解 发现所有直径都经过的边 一定在一条直径上,并且是连续的 在一条直径上找这段区间的两个就好了 代码 #include<map> ...

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

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

  4. 3124: [Sdoi2013]直径

    3124: [Sdoi2013]直径 https://www.lydsy.com/JudgeOnline/problem.php?id=3124 分析: 所有直径都经过的边,一定都是连续的一段.(画个 ...

  5. luogu P3305 [SDOI2013]费用流

    题目链接 bz似乎挂了... luogu P3305 [SDOI2013]费用流 题解 dalao告诉我,这题 似乎很水.... 懂了题目大意就可以随便切了 问1,最大流 问2,二分最大边权求,che ...

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

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

  7. BZOJ_3124_[Sdoi2013]直径_树形DP

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

  8. Bzoj 3124: [Sdoi2013]直径 题解

    3124: [Sdoi2013]直径 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1222  Solved: 580[Submit][Status] ...

  9. 【洛谷 P3304】[SDOI2013]直径(树的直径)

    题目链接 题意,求一棵树被所有直径经过的边的条数. 这题是我们8.25KS图论的最后一题,当时我果断打了暴力求所有直径然后树上差分统计的方法,好像有点小问题,boom0了. 考完改这题,改了好久,各种 ...

随机推荐

  1. linux系统下find命令的使用

    1.find /* -name erlang 当前目录下,查找名为erlang的文件和目录 find /* -name rabbitmq-server 当前目录下,查找名为 rabbitmq-serv ...

  2. Lodop打印条码二维码设置多宽不一定是多宽

    Lodop输出二维码和条码,可用如下语句,其中下面的width和height参数,设置了条码或二维码多宽,会发现可能不是设置的宽度或高度.ADD_PRINT_BARCODE(Top,Left,Widt ...

  3. LAMP平台部署

    LAMP平台的概述 LAMP环境脚本部署:https://github.com/spdir/ShellScripts/tree/master/lamp LAMP的介绍:百度百科 LAMP平台的构成组件 ...

  4. BZOJ1127 POI2008KUP(悬线法)

    首先显然地,如果某个格子的权值超过2k,其一定不在答案之中:如果在[k,2k]中,其自身就可以作为答案.那么现在我们只需要考虑所选权值都小于k的情况. 可以发现一个结论:若存在一个权值都小于k的矩阵其 ...

  5. 洛谷P4072 [SDOI2016]征途(带权二分,斜率优化)

    洛谷题目传送门 一开始肯定要把题目要求的式子给写出来 我们知道方差的公式\(s^2=\frac{\sum\limits_{i=1}^{m}(x_i-\overline x)^2}{m}\) 题目要乘\ ...

  6. 自学Zabbix2.2-服务器端环境配置

    点击返回:自学Zabbix之路

  7. 自学Python5.1-面向对象与面向过程

    自学Python之路 自学Python5.1-面向对象与面向过程 面向过程:根据业务逻辑从上到下写代码. 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开 ...

  8. STM32外设地址查询

    问题的提出 DMA传输SDIO驱动的SD卡的数据,其中外设地址的确定 问题的解决 打开数据参考手册,在存储器和总线架构一章存储器映像小节,有一个寄存器组起始地址表,列举所有外设对应的起始地址,再到相应 ...

  9. uoj233/BZOJ4654/洛谷P1721 [Noi2016]国王饮水记 【dp + 斜率优化】

    题目链接 uoj233 题解 下面不加证明地给出几个性质: 小于\(h[1]\)的城市一定是没用的 任何城市联通包含\(1\)且只和\(1\)联通一次 联通顺序从小到大最优 单个联通比多个一起联通要优 ...

  10. SQL中on条件与where条件的区别

    数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户.  在使用left jion时,on和where条件的区别如下:   1.on条件是在生成临时表时使用 ...