洛谷 [P3629] 巡逻
2024-09-04 03:02:35
树的直径
树的直径有两种求法
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;
}
最新文章
- AC日记——舒适的路线 codevs 1001 (并查集+乱搞)
- edgesForExtendedLayout、extendedLayoutIncludesOpaqueBars、automaticallyAdjustsScrollViewInsets属性详解 )——转载
- fenshijin
- linux 下wifi 功能的实现
- http-equiv
- 【译】 AWK教程指南 4通过文本内容和对比选择指定的记录
- 【BZOJ 1096】 [ZJOI2007]仓库建设 (斜率优化)
- 在Nginx中搭建Nagios监控平台
- C++中数字与字符串之间的转换
- 网络子系统43_ip选项预处理
- jQuery 中的事件绑定与取消绑定
- 《JavaScript设计模式与开发实践》读书笔记之策略模式
- CodeForces 617C Watering Flowers
- 『线段树 Segment Tree』
- EBGP在非直连网络时,需要配置ebgp的最大跳数,否则无法建立非直连的EBGP邻居
- Kafka-python 客户端导致的 cpu 使用过高,且无法消费消息的问题
- 微信小程序电商实战(-)商城首页
- OpenCV遍历彩色图像、灰度图像的像素值方法
- vim使用技巧大全
- html和css入门 (一)
热门文章
- Ubuntu编译Android源码过程中的空间不足解决方法
- CVE-2014-1767
- mysql基本知识点
- unbuntu14下Qt4.8 和MySQL连接问题 QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available drivers: QSQLITE
- windows charles 抓包https请求
- vue 项目白屏解决方案
- Linux 常用命令(三)
- Linux 安装Nginx+PHP+MySQL教程
- python导出开发环境
- drf 解析器,响应器,路由控制