显然删掉的边肯定是直径上的边。考虑枚举删哪一条。然后考虑怎么连。显然新边应该满足其两端点在各自树中作为根能使树深度最小。只要线性求出这个东西就可以了,这与求树的重心的过程类似。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 5010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
int n,p[N],deep[N],fa[N],f[N],len[N],t,root,ans=N*N;
bool flag[N];
struct data{int to,nxt,len;
}edge[N<<1];
void addedge(int x,int y,int z){t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].len=z,p[x]=t;}
void dfs(int k)
{for (int i=p[k];i;i=edge[i].nxt)if (edge[i].to!=fa[k]){deep[edge[i].to]=deep[k]+edge[i].len;fa[edge[i].to]=k;len[edge[i].to]=edge[i].len;dfs(edge[i].to);}
}
int dp(int k,int ban)
{flag[k]=1;int mx=0,mx2=0,ans=0;for (int i=p[k];i;i=edge[i].nxt)if (!flag[edge[i].to]&&edge[i].to!=ban){ans=max(ans,dp(edge[i].to,ban));int x=f[edge[i].to]+edge[i].len;if (x>mx) mx2=mx,mx=x;else if (x>mx2) mx2=x;}f[k]=mx;return max(ans,mx+mx2);
}
int findroot(int k,int ban,int last)
{int mx=0,mx2=0,l=0,len=0;for (int i=p[k];i;i=edge[i].nxt)if (edge[i].to!=fa[k]&&edge[i].to!=ban){int x=f[edge[i].to]+edge[i].len;if (x>mx) mx2=mx,mx=x,l=edge[i].to,len=edge[i].len;else if (x>mx2) mx2=x;}if (max(last,mx2)+len<mx) return findroot(l,ban,max(last,mx2)+len);else return k;
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("bzoj4890.in","r",stdin);freopen("bzoj4890.out","w",stdout);const char LL[]="%I64d\n";
#elseconst char LL[]="%lld\n";
#endifn=read();for (int i=1;i<n;i++){int x=read(),y=read(),z=read();addedge(x,y,z),addedge(y,x,z);}dfs(1);int root=1;for (int i=2;i<=n;i++) if (deep[i]>deep[root]) root=i;fa[root]=deep[root]=0;dfs(root);int x=1;for (int i=2;i<=n;i++) if (deep[i]>deep[x]) x=i;while (x!=root){memset(f,0,sizeof(f));memset(flag,0,sizeof(flag));int t=max(dp(root,x),dp(x,fa[x]));int u=findroot(root,x,0),v=findroot(x,fa[x],0);memset(f,0,sizeof(f));memset(flag,0,sizeof(flag));dp(u,x),dp(v,fa[x]);ans=min(ans,max(f[u]+f[v]+len[x],t));x=fa[x];}cout<<ans;return 0;
}

转载于:https://www.cnblogs.com/Gloid/p/10031368.html

BZOJ4890 Tjoi2017城市相关推荐

  1. bzoj4890: [Tjoi2017]城市

    [题意] 给出一棵带边权的树,删掉一条边,再加上一条相同权值的边,使得在保持新图仍是一棵树的情况下,最远点对距离最小,求出这个距离. [题解] 枚举删掉哪条边,然后原图变成2棵树. 之后的加边肯定是加 ...

  2. [TJOI2017]城市(未解决)

    [TJOI2017]城市 题意: 一棵树,现在要求你将一条边改变他的位置,(即改变左右所连接的端点,权值不变),修改后任意两点相互可达,且使得两个点之间的最大交通费用最小 题解: 有O(n^2)和O( ...

  3. BZOJ4890 洛谷3761:[TJOI2017]城市——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4890 https://www.luogu.org/problemnew/show/P3761 从加 ...

  4. P3761 [TJOI2017]城市

    题目链接 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有 n 座城市,n-1 条高速公路,保证了任意两运城市之间都可以通过高速公路相互可达,但是通过一条高速公路需要收取 ...

  5. 退役前的做题记录1.0

    退役前的做题记录1.0 租酥雨最近很懒qwq,具体表现在写题的时候不想发题解了. 但是想想这样也不太好,就决定发个一句话(半句话到几句话不等)题解上来. 2018-09.18-2018-09.28 [ ...

  6. 2017.10.27涩会题大乱斗部分题解

    A P3741 honoka的键盘 和昨天的T1一样, 枚举改哪一个 1 #include<cstdio> 2 #include<cstring> 3 #include< ...

  7. P3758 [TJOI2017]可乐

    P3758 [TJOI2017]可乐 这个题是利用了邻接矩阵的性质 即:对于一个邻接矩阵\(E\),表示从\(E[i][j]\)到\(i\)到\(j\)路径长度为1的方案数是多少.那么\(E^k[i] ...

  8. 洛谷P3758 [TJOI2017]可乐

    原题链接:洛谷P3758 [TJOI2017]可乐  题目描述 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上.这个可乐机器人有三种行为: ...

  9. 洛谷 P3758 [TJOI2017]可乐

    洛谷 P3758 [TJOI2017]可乐 Description 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上.这个可乐机器人有三种行 ...

最新文章

  1. Spring Boot 2.4 对多环境配置的支持更改
  2. [BZOJ2693]jzptab
  3. 用D触发器构造RAM存储器
  4. 数论与数学专题练习(一)(201802~201805)
  5. 指定的命名连接在配置中找不到、非计划用于 EntityClient 提供程序或者无效
  6. php日期提示警告,php程序报date()警告的处理的解决方法
  7. 被“薅羊毛”损失200多万!元气森林:系运营事故
  8. Oracle11g数据库快速安装
  9. 问题 D: 求圆的面积和周长 山东科技大学oj c 语言
  10. Python中利用*打印不同的三角形
  11. 数据库连接池配置和优化
  12. mysql触发器编程_mysql之触发器trigger详解
  13. 清华大学范玉顺互联网与大数据_互联网+时代的互联网思维与大数据思维
  14. 一个被加入下载QQ盗号木马Trojan.PSW.QQPass.rie代码的网站
  15. 【Docker】seaweedfs的搭建与使用
  16. boost电路输出电流公式_boost计算公式
  17. SDP中fingerprint的作用
  18. android钟表,Android打造属于自己的时间钟表
  19. 【OpenFOAM学前预备3——安装OpenFOAM-v8】
  20. 用三个步骤实现响应式网页设计

热门文章

  1. java二嗨租车项目_Java入门第二季6-1租车项目代码
  2. lisp 揭 院长_HISLISPACSRIS EMR系统简介
  3. python程序写诗_用Python作诗,生活仍有诗和远方
  4. python大作业外星人入侵_【python3小白上路系列】外星人入侵——开始
  5. java冒泡遍历对象_Java经典排序算法(冒泡、选择、插入)
  6. java缓冲输入流_java _io_字符缓冲流的输入、输出
  7. three.js制作3d模型工具_3D打印模型打磨抛光常用工具
  8. 阿里云centos 7.6安装mysql_阿里云Centos7上安装MySQL教程
  9. java reader_Java Reader reset()方法与示例
  10. 物联网基础知识_联网| 基础知识能力问答 套装1