树的直径

树的直径有两种求法

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;
}

最新文章

  1. AC日记——舒适的路线 codevs 1001 (并查集+乱搞)
  2. edgesForExtendedLayout、extendedLayoutIncludesOpaqueBars、automaticallyAdjustsScrollViewInsets属性详解 )——转载
  3. fenshijin
  4. linux 下wifi 功能的实现
  5. http-equiv
  6. 【译】 AWK教程指南 4通过文本内容和对比选择指定的记录
  7. 【BZOJ 1096】 [ZJOI2007]仓库建设 (斜率优化)
  8. 在Nginx中搭建Nagios监控平台
  9. C++中数字与字符串之间的转换
  10. 网络子系统43_ip选项预处理
  11. jQuery 中的事件绑定与取消绑定
  12. 《JavaScript设计模式与开发实践》读书笔记之策略模式
  13. CodeForces 617C Watering Flowers
  14. 『线段树 Segment Tree』
  15. EBGP在非直连网络时,需要配置ebgp的最大跳数,否则无法建立非直连的EBGP邻居
  16. Kafka-python 客户端导致的 cpu 使用过高,且无法消费消息的问题
  17. 微信小程序电商实战(-)商城首页
  18. OpenCV遍历彩色图像、灰度图像的像素值方法
  19. vim使用技巧大全
  20. html和css入门 (一)

热门文章

  1. Ubuntu编译Android源码过程中的空间不足解决方法
  2. CVE-2014-1767
  3. mysql基本知识点
  4. unbuntu14下Qt4.8 和MySQL连接问题 QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available drivers: QSQLITE
  5. windows charles 抓包https请求
  6. vue 项目白屏解决方案
  7. Linux 常用命令(三)
  8. Linux 安装Nginx+PHP+MySQL教程
  9. python导出开发环境
  10. drf 解析器,响应器,路由控制