[BZOJ 4890][TJOI2017]城市
$ \color{green} {solution : }$
我们可以暴力枚举断边,然后 $ O(n) $ 的跑一次换根 $ dp $,然后复杂度是 $ O(n * n) $ 的
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
template <typename T> inline void G(T &x) {
x = 0; char o; bool f = false;
for ( ; !isdigit(o = getchar()); ) {
if( o == '-') {
f = true;
}
}
for ( ; isdigit(o); o = getchar()) {
x = (x << 1) + (x << 3) + (o & 15);
}
if( f) {
x = ~x + 1;
}
}
template <typename T> inline bool check_Max(T &x, const T &y) {
return x < y ? x = y, false : true;
}
template <typename T> inline bool check_Min(T &x, const T &y) {
return x > y ? x = y, false : true;
}
struct Edge {
int v, w; Edge *to;
Edge ( int v, int w, Edge *to) : v(v), w(w), to(to) {}
Edge () {}
}*head[maxn], pool[maxn<<1], *pis = pool;
int di[maxn], ndi[maxn];
inline void dfs1(int u, int pre, int &Mx) {
di[u] = ndi[u] = 0;
for ( Edge *now = head[u]; now; now = now->to) if( now->v ^ pre) {
dfs1(now->v, u, Mx);
check_Max(ndi[u], di[now->v] + now->w);
if(ndi[u] > di[u]) {
swap(ndi[u], di[u]);
}
}
check_Max(Mx, ndi[u] + di[u]);
}
inline void dfs2(int u, int pre, int &Mx) {
check_Min(Mx, di[u]);
for ( Edge *now = head[u]; now; now = now->to) if( now->v ^ pre) {
if( di[u] == di[now->v] + now->w) {
check_Max(ndi[now->v], ndi[u] + now->w);
}
else {
check_Max(ndi[now->v], di[u] + now->w);
}
if( ndi[now->v] > di[now->v]) {
swap(di[now->v], ndi[now->v]);
}
dfs2(now->v, u, Mx);
}
}
int n;
struct line {
int l, r, w;
}data[maxn];
int main() {
G(n);
for ( register int i = 1; i < n; ++ i) {
G(data[i].l); G(data[i].r); G(data[i].w);
int u = data[i].l, v = data[i].r, w = data[i].w;
head[u] = new (pis ++) Edge(v, w, head[u]); head[v] = new (pis ++) Edge(u, w, head[v]);
}
int ans = 0x7fffffff;
for ( register int i = 1; i < n; ++ i) {
int mx1 = 0, mx2 = 0, ret = 0;
dfs1(data[i].l, data[i].r, mx1); dfs1(data[i].r, data[i].l, mx2);
check_Max(ret, mx1); check_Max(ret, mx2);
int mx3 = di[data[i].l], mx4 = di[data[i].r];
dfs2(data[i].l, data[i].r, mx3); dfs2(data[i].r, data[i].l, mx4);
check_Max(ret, mx3 + mx4 + data[i].w);
check_Min(ans, ret);
}
printf("%d\n",ans);
return 0;
}

[BZOJ 4890][TJOI2017]城市的更多相关文章
- BZOJ 4890: [Tjoi2017]城市 树形dp
标签:树形dp,枚举,树的直径 一上来看到这个题就慌了,只想到了 $O(n^3)$ 的做法. 碰到这种题时要一步一步冷静地去分析,观察数据范围. 首先,$n\leqslant 5000$,所以可以先 ...
- bzoj4890[Tjoi2017]城市(树的半径)
4890: [Tjoi2017]城市 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 149 Solved: 91[Submit][Status][D ...
- 【BZOJ4890】[TJOI2017]城市(动态规划)
[BZOJ4890][TJOI2017]城市(动态规划) 题面 BZOJ 洛谷 题解 数据范围都这样了,显然可以暴力枚举断开哪条边. 然后求出两侧直径,暴力在直径上面找到一个点,使得其距离直径两端点的 ...
- [洛谷P3761] [TJOI2017]城市
洛谷题目链接:[TJOI2017]城市 题目描述 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有ri座城市,<-1条高速公路,保证了任意两运城市之间都可以通过高速 ...
- Luogu 3761 [TJOI2017]城市
BZOJ 4890. 在树上断开一条边之后会形成两个联通块,如果要使这一条边接回去之后保持一棵树的形态,那么必须在两个联通块之间各找一个点连接. 那么,对于每一条可能断开的边,它产生的答案是以下两者的 ...
- 换根DP+树的直径【洛谷P3761】 [TJOI2017]城市
P3761 [TJOI2017]城市 题目描述 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有ri座城市,<-1条高速公路,保证了任意两运城市之间都可以通过高速公 ...
- [TJOI2017]城市(树的直径)
[TJOI2017]城市 题目描述 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有ri座城市,<-1条高速公路,保证了任意两运城市之间都可以通过高速公路相互可达, ...
- BZOJ4890 & 洛谷3761:[TJOI2017]城市——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4890 https://www.luogu.org/problemnew/show/P3761 从加 ...
- [bzoj 4887] [Tjoi2017]可乐
传送门 Description 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且 放在了加里敦星球的1号城市上.这个可乐机器人有三种行为:停在原地,去下一个相邻的 城市 ...
随机推荐
- loadrunner怎么进行内容检查
运行测试时,常常需要验证某些内容是否出现在返回的页面上.内容检查验证脚本运行时 Web 页面上是否出现期望的信息.可以插入两种类型的内容检查:➤ 文本检查.检查文本字符串是否出现在 Web 页面上.➤ ...
- [C++] static member variable and static const member variable
static member variable[可读可写] 可以通过指针间接修改变量的值 static const member variable[只读] 压根就不可以修改变量的值,会报错
- python CSV 文件的读写
1.CSV文件 import csv with open(r"E:\code\0_DataSet\tianchi_2015_mobile_recommand\fresh_comp_offli ...
- 关于Manifest merger failed : uses-sdk:minSdkVersion 8 cannot be smaller than version 16 declared in lib
日志有些长,标题显示不完,截图如下: 有图可以知道,是因为在引入的libary里面的build.gradle文件里面的minSdkVersion不一致导致这个问题出现的.修改一致即可.这个问题是在co ...
- Linq学习<五> 运用linq查询Xml
这节将学习如何用 linq查询xml 一.我们先看看在xml中我们怎么操作 public void xmlWayToQueryXmlFile() { XmlDocument xmldoc = new ...
- .NET基础 (04)基础类型和语法
基础类型和语法1 .NET中所有内建类型的基类是什么2 System.Object中包含哪些方法,哪些是虚方法3 值类型和引用类型的区别4 简述装箱和拆箱原理5 C#中是否有全局变量6 struct和 ...
- Python之安装第三方扩展库
PyPI 地址:https://pypi.python.org/pypi 如果你知道你要找的库的名字,那么只需要在右上角搜索栏查找即可. 1.pip安装扩展库 (1)安装最新版本的扩展库: cmd&g ...
- SpringCloud教程 | 第四篇:断路器(Hystrix)(Finchley版本)
在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用,单个服务 ...
- Tomcat应用配置
为Tomcat添加管理员 为了更好的管理tomcat服务器,我们通常会给tomcat添加用户管理员,这样就可以登录进入查看发布的项目.以下是实际操作步骤: 在Tomcat的配置目录下找到tomcat- ...
- 【转】Android - 线程同步
什么是线程同步? 当使用多个线程来访问同一个数据时,非常容易出现线程安全问题(比如多个线程都在操作同一数据导致数据不一致),所以我们用同步机制来解决这些问题. 实现同步机制有两个方法: 1.同步代码块 ...