https://www.lydsy.com/JudgeOnline/problem.php?id=4890

https://www.luogu.org/problemnew/show/P3761

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

小明对这个地区深入研究后,觉得这个地区的交通费用太贵。小明想彻底改造这个地区,但是由于上司给他的资源有限,因而小明现在只能对一条高速公路进行改造,改造的方式就是去掉一条高速公路,并且重新修建一条一样的高速公路(即交通费用一样),使得这个地区的两个城市之间的最大交通费用最小(即使得交通费用最大的两座城市之间的交通费用最小),并且保证修建完之后任意两座城市相互可达。如果你是小明,你怎么解决这个问题?

前置技能:树直径,树半径(代码的树半径是我自己yy的请无视orz)

复杂度显然是$O(n^2)$的,这就使我们支持枚举每条边求出答案。

设拆完路之后的两棵树为$A,B$,那么就有三种情况:

最长路在$A$中

最长路在$B$中

最长路端点分别在$A,B$中

前两者求树直径即可,至于最后一个我们就需要考虑一个问题,到底要把边加在哪里才能使这种情况的长度最小。

显然是要加在树半径最小的两个点上(懒得证了)。

于是切了(顺便复习了怎么求树直径和半径,我觉得我多半是废了基本技能都不会了。)

#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=5005;
const int INF=1e9;
inline int read(){int X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
struct node{int w,to,nxt;
}e[N*2];
int n,cnt,head[N],f[N][3];
bool vis[N];
inline void add(int u,int v,int w){e[++cnt].to=v;e[cnt].w=w;e[cnt].nxt=head[u];head[u]=cnt;
}
int ans;
void dfs1(int u,int fa){for(int i=head[u];i;i=e[i].nxt){int v=e[i].to,w=e[i].w;if(vis[v]||fa==v)continue;dfs1(v,u);if(f[u][0]<f[v][0]+w){f[u][1]=f[u][0];f[u][0]=f[v][0]+w;}else if(f[u][1]<f[v][0]+w)f[u][1]=f[v][0]+w;}ans=max(ans,f[u][0]+f[u][1]);
}
void dfs2(int u,int fa){for(int i=head[u];i;i=e[i].nxt){int v=e[i].to,w=e[i].w;if(vis[v]||fa==v)continue;f[v][2]=f[u][2]+w;if(f[u][0]-w!=f[v][0])f[v][2]=max(f[v][2],f[u][0]+w);else f[v][2]=max(f[v][2],f[u][1]+w);dfs2(v,u);}ans=min(ans,max(f[u][0],f[u][2]));
}
int main(){n=read();for(int i=1;i<n;i++){int u=read(),v=read(),w=read();add(u,v,w);add(v,u,w);}int sum=INF;for(int i=1;i<=cnt;i+=2){int u=e[i].to,v=e[i+1].to,w=e[i].w;int w1,w2,tmp=0;vis[v]=1;memset(f,0,sizeof(f));ans=0;dfs1(u,0);tmp=max(tmp,ans);ans=INF;dfs2(u,0);w1=ans;vis[v]=0;vis[u]=1;ans=0;dfs1(v,0);tmp=max(tmp,ans);ans=INF;dfs2(v,0);w2=ans;vis[u]=0;tmp=max(tmp,w1+w2+w);sum=min(sum,tmp);}printf("%d\n",sum);return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/9194825.html

BZOJ4890 洛谷3761:[TJOI2017]城市——题解相关推荐

  1. 洛谷P3758 [TJOI2017]可乐

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

  2. 洛谷 P3758 [TJOI2017]可乐

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

  3. 洛谷P4568 [JLOI2011] 飞行路线 题解

    洛谷P4568 [JLOI2011] 飞行路线 题解 题目链接:P4568 [JLOI2011] 飞行路线 题意: Alice 和 Bob 现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公 ...

  4. 洛谷 P1137 旅行计划 题解

    洛谷 P1137 旅行计划 题解 洛谷 P1137 题目 小明要去一个国家旅游.这个国家有 N N N个城市,编号为1至 N N N,并且有 M M M条道路连接着,小明准备从其中一个城市出发,并只往 ...

  5. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  6. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

  7. 洛谷P1273 有线电视网 题解

    洛谷P1273 有线电视网 题解 题目链接:P1273 有线电视网 题意: 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为 ...

  8. 洛谷P3426 [POI2005]SZA-Template 题解

    洛谷P3426 [POI2005]SZA-Template 题解 题目链接:P3426 [POI2005]SZA-Template 题意:你打算在纸上印一串字母. 为了完成这项工作,你决定刻一个印章. ...

  9. 洛谷P1156 垃圾陷阱 题解浅谈刷表法与填表法

    洛谷P1156 垃圾陷阱 题解&浅谈刷表法与填表法 填表法 :就是一般的动态规划,当前点的状态,可以直接用状态方程,根据之前点的状态推导出来. 刷表法:由当前点的状态,更新其他点的状态.需要注 ...

最新文章

  1. 没有提示_华为手机发出莫名的提示音,打开什么也没有?原来是它们在作怪
  2. Hinton等6位图灵奖得主、百余位顶级学者邀你加入群聊,共话人工智能下一个十年...
  3. eclipse 和 myeclipse 字符编码设置
  4. 程序员如何快速准备面试中的算法 - 结构之法
  5. 【树链剖分】旅游(luogu 3976)
  6. Postman Forbidden (CSRF token missing or incorrect.)
  7. 《Reids 设计与实现》第二十章 监视器
  8. Linux下C语言的调试器 Gdb
  9. Java编写网络爬虫
  10. java实现短信验证码发送功能
  11. Mutual Component Convolutional Neural Networks for Heterogeneous Face Recognition阅读笔记
  12. photoshop批处理改变图片大小
  13. Unity3D学习 ③ 摄像机视角跟随
  14. 大吉大利今晚吃鸡——枪械篇
  15. 互联网历史上50个最重要的时刻
  16. P1458 [USACO2.1]顺序的分数 Ordered Fractions
  17. 从沟通的一般模型想到互联网,再想到数字媒体,最后想到信息世界
  18. Shell编程实战范例
  19. 服务器的创意工坊文件,Steam 创意工坊实现指南
  20. C++(10-2)——类的使用

热门文章

  1. 最全总结:把模块当做脚本来执行的 7 种案例及其原理
  2. select sum也会返回null值
  3. laravel的日志服务
  4. 如何优雅的编写 JavaScript 代码
  5. 使用tcpwrapper实现访问控制功能
  6. Android Training - 使用IntentService运行任务(Lesson 2 - 发送任务给IntentService)
  7. [读书笔记]C#学习笔记七: C#4.0中微小改动-可选参数,泛型的可变性
  8. wordpress主题wp-office2010初版
  9. make life colorful
  10. 微服务测试之静态代码扫描