图论--树的直径--DFS+树形DP模板
#include <iostream>
#include <cstring>
using namespace std;
//maxv:源点能到的最远点,maxdis:最远点对应的距离,
const int maxn = 1e4 + 5;
struct Edge { int to, next, w; }edges[2 * maxn];
int head[maxn], maxdis,maxv, tot;
void add(int u, int v, int w) {
edges[tot] = { v, head[u], w };
head[u] =tot++;
}
void dfs(int u, int f, int Val) {
if (maxdis < Val){
maxdis = Val;
maxv = u;
}
for (int e = head[u]; e != -1; e = edges[e].next) {
int v = edges[e].to, w = edges[e].w;
if (v == f) continue; //父节点已经访问过,防止重复遍历,相反孩子不会重复遍历。
dfs(v, u, Val + w);
}
}
int main()
{
int e, u, v, w, s;
cin >> e;
memset(head, -1, sizeof(head));
for (int i = 1; i <= e; i++) {
cin >> u >> v >> w;
add(u, v, w), add(v, u, w);
}
dfs(1, -1, 0); //从结点1开始遍历,找到最远点maxv及对应的最远距离maxdis
maxdis = 0;
cout <<maxv<<endl;//输出直径的第一个端点
dfs(maxv, -1, 0);//从结点maxv开始遍历,找到最远点对应的距离maxdis
cout << maxdis << endl; //輸出树的直径
cout <<maxv<<endl;//输出树的直径的第二个端点
return 0;
}
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int const MAX = 100005;
int head[MAX], dp[MAX][2];
int n, s, cnt, ans;
struct EDGE
{
int v, w, next;
} e[MAX];
void Add(int u, int v, int w)
{
e[cnt].v = v;
e[cnt].w = w;
e[cnt].next = head[u];
head[u] = cnt++;
}
void DFS(int u, int fa)
{
dp[u][0] = dp[u][1] = 0;
for (int i = head[u]; i != -1; i = e[i].next)
{
int v = e[i].v;
int w = e[i].w;
if (v != fa)
{
DFS(v, u);
if (dp[u][0] < dp[v][0] + w)
{
int tmp = dp[u][0];
dp[u][0] = dp[v][0] + w;
dp[u][1] = tmp;
}
else if (dp[u][1] < dp[v][0] + w)
dp[u][1] = dp[v][0] + w;
}
}
ans = max(ans, dp[u][1] + dp[u][0]);
return;
}
int main()
{
cnt = 0;
ans = 0;
memset(head, -1, sizeof(head));
scanf("%d %d", &n, &s);
int sum = 0;
for (int i = 0; i < n - 1; i++)
{
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
Add(u, v, w);
Add(v, u, w);
sum += 2 * w;
}
DFS(s, -1);
printf("%d\n", ans);
}
图论--树的直径--DFS+树形DP模板的更多相关文章
- 【HDOJ2196】Computer(树的直径,树形DP)
题意:给定一棵N个点树,询问这个树里面每个点到树上其他点的最大距离. n<=10000 思路:设f[u,1],f[u,2]为以U为根向下的最长与次长,g[u,1],g[u,2]为从哪个儿子转移来 ...
- BZOJ_3124_[Sdoi2013]直径_树形DP
BZOJ_3124_[Sdoi2013]直径_树形DP Description 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵 ...
- 【BZOJ-1912】patrol巡逻 树的直径 + DFS(树形DP)
1912: [Apio2010]patrol 巡逻 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1034 Solved: 562[Submit][St ...
- Codeforces 592D - Super M - [树的直径][DFS]
Time limit 2000 ms Memory limit 262144 kB Source Codeforces Round #328 (Div. 2) Ari the monster is n ...
- POJ 1849 - Two - [DFS][树形DP]
Time Limit: 1000MS Memory Limit: 30000K Description The city consists of intersections and streets t ...
- 杭电OJ——1011 Starship Troopers(dfs + 树形dp)
Starship Troopers Problem Description You, the leader of Starship Troopers, are sent to destroy a ba ...
- [BZOJ4379][POI2015]Modernizacja autostrady[树的直径+换根dp]
题意 给定一棵 \(n\) 个节点的树,可以断掉一条边再连接任意两个点,询问新构成的树的直径的最小和最大值. \(n\leq 5\times 10^5\) . 分析 记断掉一条边之后两棵树的直径为 \ ...
- 历届试题 大臣的旅费-(树的直径+dfs)
问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首 ...
- 2018.11.05 bzoj3124: [Sdoi2013]直径(树形dp)
传送门 一道sbsbsb树形dpdpdp 第一问直接求树的直径. 考虑第二问问的边肯定在同一条直径上均是连续的. 因此我们将直径记下来. 然后对于直径上的每一个点,dpdpdp出以这个点为根的子树中不 ...
随机推荐
- Linux 压缩备分篇(一 备份数据)
备份文件 dump dump: -S 仅列出待备份数据需要多少磁盘空间才能够备份完毕 -u 将 ...
- Dos 命令启动网卡
禁用网卡: netsh interface set interface "本地连接" disabled 启用网卡 : netsh interface set interface & ...
- "额外插入的文本"组件:<ins> —— 快应用组件库H-UI
 <import name="ins" src="../Common/ui/h-ui/text/c_tag_underline"></imp ...
- springboot https证书配置
如果公司有提供证书如: 拿到证书秘钥可直接在springboot 的配置文件中配置: server.ssl.key-store=classpath:cert.pfx server.ssl.key-st ...
- ES5与ES6 this 指向详细解析(箭头函数)
首先要明白箭头函数的作用: 箭头函数除了让函数的书写变得很简洁,可读性很好外:最大的优点是解决了this执行环境所造成的一些问题.比如:解决了匿名函数this指向的问题(匿名函数的执行环境具有全局性) ...
- Redis入门使用 -- 个人总结
目录 什么是Redis? Redis 与其他 key - value 数据库的对比 Redis 能干什么 Redis的安装配置 Redis启动和连接 上面开启的是非守护线程下启动(独占模式),下面我们 ...
- python3_learn 实现文件夹内批量对图片重命名
初衷 练习Python,提高动手能力. 珍藏的壁纸文件夹名命有点乱. 可以学习下一些基础的库 开始(.jpg,无筛选) First 首先找到OS库,寻找可以遍历文件名的.找到了OS.walk() os ...
- jmeter if控制器使用
if控制器有两种用法 1.不勾选“interpret condition as variable expression” 直接输入我们需要判断的表达式即可,判断表达式为真时,执行if控制器下的请求 2 ...
- C# 基础知识系列- 13 常见类库介绍(二)日期时间类
0. 前言 上一篇内容介绍了Console类和Math类,这篇内容着重介绍一下C#中时间日期的处理方式. 上一篇勘误: 上一篇中关于静态类没有构造函数,这一表述有误.正确的说法是C#中静态类不包含常规 ...
- ORM之单表、多表操作
参考1 参考2 表与表之间的关系: 一对一(OneToOneField):一对一字段无论建在哪张关系表里面都可以,但是推荐建在查询频率比较高的那张表里面 一对多(ForeignKey):一对多字段建在 ...