本题就是从c到a/b再到b/a距离的最大值,显然,a和b分别是树的直径的两个端点,先用两次dfs求出树的直径,再用一次dfs求出每个点到a的距离,最后再用一次dfs求出每个点到距离它较近的a/b的距离,最后以每个节点为c枚举求最大距离即可。

 1 #include<bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4 const int N=200100;
5 int n,m,x,y,z,tot,p,q,head[N];
6 ll ans,sum,dis[N];
7 int nxt[N<<1],to[N<<1],w[N<<1];
8
9 void add(int x,int y,int z){
10 nxt[++tot]=head[x];
11 head[x]=tot;
12 to[tot]=y;
13 w[tot]=z;
14 }
15
16 void dfs1(int u,int fa,ll s){
17 if(s>sum) sum=s,p=u;
18 for(int i=head[u];i;i=nxt[i]){
19 int v=to[i];
20 if(v==fa) continue;
21 dfs1(v,u,s+w[i]);
22 }
23 }
24
25 void dfs2(int u,int fa,ll s){
26 if(s>ans) ans=s,q=u;
27 for(int i=head[u];i;i=nxt[i]){
28 int v=to[i];
29 if(v==fa) continue;
30 dfs2(v,u,s+w[i]);
31 }
32 }
33
34 void dfs3(int u,int fa,ll s){
35 dis[u]=s;
36 for(int i=head[u];i;i=nxt[i]){
37 int v=to[i];
38 if(v==fa) continue;
39 dfs3(v,u,s+w[i]);
40 }
41 }
42
43 void dfs4(int u,int fa,ll s){
44 dis[u]=min(dis[u],s);//在到p的距离和到q的距离中选择更近的那一个
45 for(int i=head[u];i;i=nxt[i]){
46 int v=to[i];
47 if(v==fa) continue;
48 dfs4(v,u,s+w[i]);
49 }
50 }
51
52 int main(){
53 scanf("%d%d",&n,&m);
54 for(int i=1;i<=m;i++){
55 scanf("%d%d%d",&x,&y,&z);
56 add(x,y,z);add(y,x,z);
57
58 }
59 dfs1(1,0,0);//求直径的一个端点p
60 dfs2(p,0,0);//求直径的另一端点q,和直径长度ans
61 dfs3(p,0,0);//枚举每个点到p的距离
62 dfs4(q,0,0);//枚举每个点到q的距离
63 sum=0;
64 for(int i=1;i<=n;i++)
65 sum=max(sum,dis[i]);
66 printf("%lld\n",sum+ans);
67 return 0;
68 }

最新文章

  1. 我的第一个WebAPI程序
  2. 比较好用的php函数
  3. spring源码学习之路---IOC容器初始化要义之bean定义载入(五)
  4. IE8上传文件时文件本地路径变成&quot;C:\fakepath\&quot;的问题
  5. ASP.NET中的母版页机制
  6. Java到底是不是一种纯面向对象语言?
  7. [Angular 2] Using ngrx/store and Reducers for Angular 2 Application State
  8. 201521123069 《Java程序设计》 第12周学习总结
  9. labview生成可执行文件
  10. Objective-C基础之简析深浅copy
  11. python部署lvs
  12. conn.encoders[SafeBytes] = conn.encoders[bytes] KeyError: &lt;class &#39;bytes&#39;&gt;
  13. 【MySQL】redo log --- 刷入磁盘过程
  14. windows下简单的缓冲区溢出
  15. _ZNote_Qt_QtCreator_Tips_粘贴_历史剪切板
  16. system函数遇到的问题
  17. crontab -e 新法
  18. JAVA计算文件的crc32校验码
  19. Codeforces Round #415 (Div. 2)C
  20. 一步一步学EF系列【5、升级篇 实体与数据库的映射】live writer真坑,第4次补发

热门文章

  1. Linux系列之管理用户环境变量
  2. 关于Tornado5.1:到底是真实的异步和还是虚假的异步
  3. 使用python3.7+Vue.js2.0+Django2.0.4异步前端通过api上传文件到七牛云云端存储
  4. odoo 14 一些常见问题集
  5. SQL注入 基础学习
  6. 5.20 NOI 模拟
  7. Vector3类定义
  8. RunCat 怎么白嫖付费图标?这篇文章告诉你!
  9. Postfix别名邮件与SASL验证
  10. 基于开源方案构建统一的文件在线预览与office协同编辑平台的架构与实现历程