洛谷 [P3629] 巡逻
树的直径
树的直径有两种求法
1.两遍 dfs 法, 便于输出具体方案,但是无法处理负权边
2.DP 法,代码量少,可以处理负权边
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
using namespace std;
const int MAXN = 200005;
int n, k, head[MAXN], nume, fa[MAXN], ans, ma, t, d[MAXN], s;
bool f[MAXN];
struct edge {
int to, nxt, dis;
}e[MAXN<<1];
void adde(int from, int to) {
e[++nume].to = to;
e[nume].dis = 1;
e[nume].nxt = head[from];
head[from] = nume;
}
void dfs1(int u, int dep) {
if(f[u]) return ;
f[u] = 1;
if(dep > ma && u != 1) {
ma = dep;
k = u;
}
for(int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
dfs1(v, dep + e[i].dis);
}
}
void del(int u) {
for(int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if(v == fa[u]) {
e[i].dis = e[((i - 1) ^ 1) + 1].dis = -1;
del(v);
}
}
}
void dfs2(int u, int dep) {
f[u] = 1;
if(dep > ma && u != t) {
ma = dep; k = u;
}
for(int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if(!f[v]) {
fa[v] = u;
dfs2(v, dep + e[i].dis);
}
}
}
void dp(int u) {
f[u] = 1;
for(int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if(!f[v]) {
dp(v);
ma = max(ma, d[u] + d[v] + e[i].dis);
d[u] = max(d[u], d[v] + e[i].dis);
}
}
}
int main() {
cin >> n >> s;
for(int i = 1; i < n; i++) {
int u, v;
scanf("%d %d", &u, &v);
adde(u, v);
adde(v, u);
}
dfs1(1, 0);
ma = 0;t = k; k = 0;
memset(f, 0, sizeof(f));
dfs2(t, 0);
ans += 2 * (n - 1) ;
ans -= ma - 1;
if(s == 2) {
del(k);
memset(f, 0, sizeof(f));
ma = 0;
dp(1);
ans -= ma - 1;
}
cout << ans << endl;
return 0;
}
洛谷 [P3629] 巡逻的更多相关文章
- BZOJ1912 APIO2010 洛谷P3629 巡逻
Description: 在一个地区中有 n 个村庄,编号为 1, 2, ..., n.有 n – 1 条道路连接着这些村 庄,每条道路刚好连接两个村庄,从任何一个村庄,都可以通过这些道路到达其 他任 ...
- [洛谷P3629] [APIO2010]巡逻
洛谷题目链接:[APIO2010]巡逻 题目描述 在一个地区中有 n 个村庄,编号为 1, 2, ..., n.有 n – 1 条道路连接着这些村 庄,每条道路刚好连接两个村庄,从任何一个村庄,都可以 ...
- 洛谷 P3629 [APIO2010]巡逻 解题报告
P3629 [APIO2010]巡逻 题目描述 在一个地区中有 n 个村庄,编号为 1, 2, ..., n.有 n – 1 条道路连接着这些村 庄,每条道路刚好连接两个村庄,从任何一个村庄,都可以通 ...
- 洛谷 P3629 [APIO2010]巡逻
题目在这里 这是一个紫题,当然很难. 我们往简单的想,不建立新的道路时,从1号节点出发,把整棵树上的每条边遍历至少一次,再回到1号节点,会恰好经过每条边两次,路线总长度为$2(n-1)$,根据树的深度 ...
- 【洛谷 P3629】 [APIO2010]巡逻 (树的直径)
题目链接 容易发现,当加一条边时,树上会形成一个环,这个环上的每个点都是只要走一次的,也就是说我们的答案减少了这个环上点的个数,要使答案最小,即要使环上的点最多,求出直径\(L\),则答案为\(2(n ...
- 洛谷P3629 [APIO2010]巡逻(树的直径)
如果考虑不算上新修的道路,那么答案显然为\(2*(n-1)\). 考虑\(k=1\)的情况,会发现如果我们新修建一个道路,那么就会有一段路程少走一遍.这时选择连接树的直径的两个端点显然是最优的. 难就 ...
- BZOJ1912或洛谷3629 [APIO2010]巡逻
一道树的直径 BZOJ原题链接 洛谷原题链接 显然在原图上路线的总长为\(2(n-1)\). 添加第一条边时,显然会形成一个环,而这条环上的所有边全部只需要走一遍.所以为了使添加的边的贡献最大化,我们 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
随机推荐
- 2018 noip 提高组初赛参考答案
这里有pdf文件:戳这儿
- MySQL中一条SQL的加锁分析
MySQL中一条SQL的加锁分析 id主键 + RC id唯一索引 + RC id非唯一索引 + RC id无索引 + RC id主键 + RR id唯一索引 + RR id非唯一索引 + RR id ...
- 【Python学习之五】高级特性5(切片、迭代、列表生成器、生成器、迭代器)
5.迭代器 由之前的生成器可知,for循环用于可迭代对象:Iterable.包括集合数据类型: list.tuple.dict.set.str 等,以及两种生成器.判断迭代器,使用 isinstanc ...
- LeetCode (160) Intersection of Two Linked Lists
题目 Write a program to find the node at which the intersection of two singly linked lists begins. For ...
- L2-006 树的遍历 RTA
L2-006 树的遍历(25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(<=30),是二叉树 ...
- Centos7 install Openstack Juno (RDO) (转载)
原文地址:http://www.hdume.com/centos-7-0%E5%AE%89%E8%A3%85openstack/ 1.安装系统,Centos7镜像采用CentOS-7.0-1406-x ...
- 离线安装eclipse maven插件
最近用到maven,所以按照官网http://www.eclipse.org/m2e/的教程http://download.eclipse.org/technology/m2e/releases/,在 ...
- CodeForces 392C Yet Another Number Sequence 矩阵快速幂
题意: \(F_n\)为斐波那契数列,\(F_1=1,F_2=2\). 给定一个\(k\),定义数列\(A_i=F_i \cdot i^k\). 求\(A_1+A_2+ \cdots + A_n\). ...
- 学习boundingRectWithSize:options:attributes:context:计算文本尺寸
oundingRectWithSize:options:context: 返回文本绘制所占据的矩形空间. - (CGRect)boundingRectWithSize:(CGSize)size opt ...
- Wordpress入门笔记
简单介绍一下wordpress个人操作,建议安装中文版. 登入后台管理者页面, 浏览器地址栏输入 (线上) http://XXXX.com/wp-login.php (本地) ht ...