「NOI2003」逃学的小孩
传送门:>HERE<
题意:给出一棵树(带权),要从一个节点C先走到距离它近的一个节点B,再走到A,要求最坏情况下的总路程(即最长)。
解题思路:
乍一看,A,B,C都没给出,这怎么求?
不妨设距离C较近的点位A。
分析发现,无论怎样,A~B是一定要走的。那么如何能让树上任意两点间距离最大呢?不难发现A,B就是该树直径的两个端点。那么只要两遍BFS就好了。
那么如何让A~C的路程最长呢?注意到A到C相较A到B是较短的。所以好像不怎么好求……但是可以枚举——枚举每个点作为C到A和B的距离,求出较小的那个,并且打擂得到最大值。
Code
/*By QiXingzhi*/
#include <cstdio>
#include <queue>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#define r read()
#define Max(a,b) (((a)>(b)) ? (a) : (b))
#define Min(a,b) (((a)<(b)) ? (a) : (b))
using namespace std;
typedef long long ll;
#define int ll
const int N = ;
const int INF = ;
inline int read(){
int x = ; int w = ; register int c = getchar();
while(c ^ '-' && (c < '' || c > '')) c = getchar();
if(c == '-') w = -, c = getchar();
while(c >= '' && c <= '') x = (x << ) +(x << ) + c - '', c = getchar();
return x * w;
}
struct Edge{
int to,cost;
};
int n,m,x,y,z,A,B,ans,ans2;
int d[N], d2[N], vis[N];
vector <Edge> G[N];
queue <int> q;
inline void AddEdge(int u, int v, int w){
Edge e;
e.to = v;
e.cost = w;
G[u].push_back(e);
}
inline void BFS(int s){
while(!q.empty()) q.pop();
q.push(s);
d[s] = ;
vis[s] = ;
int cur,sz,v;
while(!q.empty()){
cur = q.front();
q.pop();
sz = G[cur].size();
for(int i = ; i < sz; ++i){
v = G[cur][i].to;
if(!vis[v]){
vis[v] = ;
d[v] = d[cur] + G[cur][i].cost;
q.push(v);
}
}
}
}
inline void BFS2(int s){
while(!q.empty()) q.pop();
q.push(s);
d2[s] = ;
vis[s] = ;
int cur,sz,v;
while(!q.empty()){
cur = q.front();
q.pop();
sz = G[cur].size();
for(int i = ; i < sz; ++i){
v = G[cur][i].to;
if(!vis[v]){
d2[v] = d2[cur] + G[cur][i].cost;
vis[v] = ;
q.push(v);
}
}
}
}
main(){
n = r, m = r;
for(int i = ; i <= m; ++i){
x = r, y = r, z = r;
AddEdge(x, y, z);
AddEdge(y, x, z);
}
BFS();
int __max = -;
for(int i = ; i <= n; ++i){
if(d[i] > __max){
__max = d[i];
A = i;
}
}
ans = __max;
memset(vis,,sizeof(vis));
BFS(A);
__max = -;
for(int i = ; i <= n; ++i){
if(d[i] > __max){
__max = d[i];
B = i;
}
}
ans = __max;
memset(vis,,sizeof(vis));
BFS2(B);
for(int i = ; i <= n; ++i) ans2 = Max(ans2, Min(d[i], d2[i]));
printf("%lld", ans+ans2);
return ;
}
「NOI2003」逃学的小孩的更多相关文章
- BZOJ 1509: [NOI2003]逃学的小孩( 树形dp )
树形dp求出某个点的最长3条链a,b,c(a>=b>=c), 然后以这个点为交点的最优解一定是a+2b+c.好像还有一种做法是求出树的直径然后乱搞... ----------------- ...
- 【BZOJ1509】[NOI2003]逃学的小孩 直径
[BZOJ1509][NOI2003]逃学的小孩 Description Input 第一行是两个整数N(3 N 200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的 ...
- [NOI2003]逃学的小孩(树的直径)
[NOI2003]逃学的小孩 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一听 ...
- 洛谷 P4408 逃学的小孩 解题报告
P4408 [NOI2003]逃学的小孩 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?&q ...
- BZOJ 1509[NOI 2003]逃学的小孩 树形dp
1509: [NOI2003]逃学的小孩 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 995 Solved: 505[Submit][Status][ ...
- NOI 2003 逃学的小孩 (树的直径)
[NOI2003 逃学的小孩] 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一 ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
随机推荐
- Django signals 信号作用及用法说明
参考:https://docs.djangoproject.com/en/1.11/ref/signals/ 1.Model signals django.db.models.signales 作用于 ...
- Django的model form组件
前言 首先对于form组件通过全面的博客介绍,对于form我们应该知道了它的大致用法,这里我们需要明确的一点是,我们定义的form与model其实没有什么关系,只是在逻辑上定义form的时候字段名期的 ...
- Node.js api接口和SQL数据库关联
数据库表创建 服务器环境配置.连接 .操作.数据库 API接口 原则:
- C. Polycarp Restores Permutation
链接 [https://codeforces.com/contest/1141/problem/C] 题意 qi=pi+1−pi.给你qi让你恢复pi 每个pi都不一样 分析 就是数学吧 a1 +(a ...
- Notepad++快捷使用
用Notepad++写代码,要是有一些重复的代码想copy一下有木有简单的方法呢,确实还是有的不过也不算太好用.主要是应用键盘上的 Home 键 和 End 键.鼠标光标停留在一行的某处,按 Home ...
- js 翻牌活动效果
直接上代码 html: <div class="index_main"> <ul class="index_card"> <li ...
- Git的配置与使用
Git的配置与使用 一,未配置过git 1.1,安装Git https://git-for-windows.github.io/ 1,2,鼠标右键点击Git Bash Here 1.3,输入命令 cd ...
- HashMap深度解析(转载)
原文地址:http://blog.csdn.net/ghsau/article/details/16890151 实现原理:用一个数组来存储元素,但是这个数组存储的不是基本数据类型.HashMap实现 ...
- LLDB 3.9.1 安装方法
1. baidu到一个安装方法 进行尝试: 来源: https://zhuanlan.zhihu.com/p/40780819https://www.jianshu.com/p/f965bbba6eb ...
- [转帖]pfSense软路由系统的使用
图解pfSense软路由系统的使用(NAT功能) http://seanlook.com/2015/04/23/pfsense-usage/ 发表于 2015-04-23 | 更新于: 2015- ...