【Luogu】P3761城市(dfs)
emmm我思维好水……
想了一会lct发现好像不对,然后开始转DP稍微有一点思路,然后看了题解……
首先可以枚举边,然后原树被你拆成了两个子树。
设D1D2是两个子树的直径,W1W2是子树内某个点到其他点最长距离的最小值,val是断掉的边的权值
然后呢我们发现此时的答案成为了max(max(D1,D2),W1+W2+val)
然后可以发现W1W2可以通过枚举子树直径上的点求得。
然后这样就TLE了23333
一个大优化是我们可以发现枚举断掉哪条边这个步骤可以变成枚举断掉直径上哪条边,只有这样才能对答案产生影响
然后就快了九倍……
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cctype>
#define maxn 6000
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} int n; struct Edge{
int next,to,val;
}edge[maxn*];
int head[maxn],num;
inline void add(int from,int to,int val){
edge[++num]=(Edge){head[from],to,val};
head[from]=num;
} int dis[maxn];
bool vis[maxn]; void find(int x,int fa,int lim){
for(int i=head[x];i;i=edge[i].next){
int to=edge[i].to;
if(to==fa||to==lim) continue;
dis[to]=dis[x]+edge[i].val;
find(to,x,lim);
}
return;
} void record(int x,int fa,int goal){
if(x==goal){
vis[x]=;
return;
}
for(int i=head[x];i;i=edge[i].next){
int to=edge[i].to;
if(to==fa) continue;
record(to,x,goal);
if(vis[to]) vis[x]=;
}
return;
} struct ANSWER{
int x,y;
}; ANSWER ask(int x,int fa){
memset(vis,,sizeof(vis));
memset(dis,-,sizeof(dis));
dis[x]=;
find(x,fa,fa);
int now=;
for(int i=;i<=n;++i)
if(dis[i]>dis[now]) now=i;
dis[now]=;
find(now,now,fa);
int to=;
for(int i=;i<=n;++i)
if(dis[i]>dis[to]) to=i;
record(now,now,to);
ANSWER ans=(ANSWER){dis[to],0x7fffffff};
for(int i=;i<=n;++i)
if(vis[i]) ans.y=min(ans.y,max(dis[to]-dis[i],dis[i]));
return ans;
} bool vie[maxn*]; int main(){
n=read();
for(int i=;i<n;++i){
int from=read(),to=read(),val=read();
add(from,to,val);
add(to,from,val);
}
ask(,);
for(int i=;i<=num;i+=){
if(vis[edge[i].to]==||vis[edge[i+].to]==) continue;
vie[i]=;
}
int ans=0x7fffffff;
for(int i=;i<=num;i+=){
if(vie[i]==) continue;
int from=edge[i].to,to=edge[i+].to,val=edge[i].val;
ANSWER l1=ask(from,to); ANSWER l2=ask(to,from);
// printf("%d %d %d %d %d %d %d\n",from,to,val,l1.x,l1.y,l2.x,l2.y);
ans=min(ans,max(max(l1.x,l2.x),l1.y+l2.y+val));
}
printf("%d\n",ans);
return ;
}
【Luogu】P3761城市(dfs)的更多相关文章
- luogu P1401 城市
题目链接 luogu P1401 城市 题解 二分最小边权,dinic检验 代码 // luogu-judger-enable-o2 /* 二分最小边权,dinic检验 */ #include< ...
- luogu P3761 [TJOI2017]城市 树的直径 bfs
LINK:城市 谢邀,学弟说的一道毒瘤题. 没有真正的省选题目毒瘤 或者说 写O(n)的做法确实毒瘤. 这里给一个花20min就写完的非常好写的暴力. 容易想到枚举哪条边删掉 删掉之后考虑在哪两个点上 ...
- luogu P4842 城市旅行
嘟嘟嘟 好题,好题 刚开始突发奇想写了一个\(O(n ^ 2)\)暴力,结果竟然过了?!后来才知道是上传题的人把单个数据点开成了10s-- 不过不得不说我这暴力写的挺好看的.删边模仿链表删边,加边的时 ...
- [luogu]P1041 传染病控制[dfs]
[luogu]P1041 传染病控制 ——!x^n+y^n=z^n 题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的 ...
- Luogu P1401 城市(二分+网络流)
P1401 城市 题意 题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最 ...
- luogu P1453 城市环路
题目描述 整个城市可以看做一个N个点,N条边的单圈图(保证图连通),唯一的环便是绕城的环路.保证环上任意两点有且只有2条路径互通.图中的其它部分皆隶属城市郊区. 现在,有一位名叫Jim的同学想在B市开 ...
- LUOGU P1453 城市环路(基环树+dp)
传送门 解题思路 一道基环树上$dp$的题,这种题比较套路吧,首先第一遍$dfs$把环找出来,然后对于环上的每一个点都向它子树内做一次树形$dp$,$f[i][0/1]$表示到了$i$这个点选或不选的 ...
- luogu P1784 数独 dfs 舞蹈链 DXL
LINK:数独 这道题好难 比DXL模板题要难上不少. 首先 还是考虑将行当做决策 那么 一共有\(9*9*9=729\) 个决策. 考虑列用来填充 需要有的条件为 某个位置能能放一次\(9*9\) ...
- [TJOI2017]城市 【树的直径+暴力+优化】
Online Judge:Luogu P3761 Label:树的直径,暴力 题目描述 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有n座城市,n-1条高速公路,保证了 ...
随机推荐
- 51nod 1101 换零钱
基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 N元钱换为零钱,有多少不同的换法?币值包括1 2 5分,1 2 5角,1 2 5 10 20 50 100元. ...
- 【转载】Cesium基础使用介绍
既然给我发了参与方式,不参加似乎有点不给人面子,反正也没多少人看我的博客,那我就试试吧,也欢迎大家自己参与:2017年度全网原创IT博主评选活动投票:http://www.itbang.me/goVo ...
- IM云通信行业步入快车道,谁将成为代表中国的全球IM“独角兽”?
2016年,Twilio的成功上市,以及抢眼的股价表现,拓宽了全球云通信行业的想象空间,行业内公司估值水平也集体上调. 在中国,IM云通信行业也从2016年开始进入了一个“黄金发展时期”,一批如融云. ...
- Android(java)学习笔记109:Java中输入和输出流概念
程序在内存中运行,文件在磁盘上,把文件从磁盘上读入内存中来,当然是输入流了, 反之,把内存中的数据写到磁盘上的文件里面去就是输出.通常都是这样的,用了过滤流的情况复杂一些,则另当别论.
- [视觉识别]OpenCV + CNN 大神符识别
数据集 Mnist数据集:http://yann.lecun.com/exdb/mnist/ 训练 import numpy as np from keras.datasets import mnis ...
- python面试笔试题汇总
Python面试攻略(嗨谈篇) 110道python面试笔试题汇总,你能答对几道? Python 面试问答 Top 25 2018 年最常见的 Python 面试题 & 答案
- c#中的里氏转换和Java中强制类型转换在多态中的应用
在c#中: 注意: 子类并没有继承父类的构造函数,而是会默认调用父类那个无参数的构造函数. 如果一个子类继承了一个父类,那么这个子类除了可以使用自己的成员外,还可以使用从父类那里继承过来的成员.但是父 ...
- python-IE浏览器调用
IE浏览器驱动添加 selenium官网有提供下载http://code.google.com/p/selenium/downloads/list 这里我用的是IEDriverServer_Win32 ...
- RabbitMQ 学习资料
https://www.rabbitmq.com/getstarted.html http://www.cnblogs.com/luxiaoxun/p/3918054.html http://back ...
- textContent和innerText属性的区别
原文摘自 textContent和innerText属性的区别 <!DOCTYPE html> <html> <head> <meta charset=&qu ...