树形DP(记忆化搜索) HYSBZ - 1509
题目链接:https://vjudge.net/problem/HYSBZ-1509
我参考的证明的论文:8.陈瑜希《多角度思考 创造性思维》_百度文库 https://wenku.baidu.com/view/f3b19d0b79563c1ec5da710e.html
第一道树形DP的题目,这里主要是寻找每一个点到其他点的距离里面最大的三个值,做两次记忆化搜索(DFS),第一次搜索求以每个点为根节点的子树(假设点1是整棵树的根节点)到它的所有儿子节点的距离里面最大的三个值(用数组mx1,mx2,mx3储存),第二次搜索是计算以每个点为子树,然后这个根节点到子树之外的所有点的距离里面的最大值(用数组f储存)。假设以点a为分叉点,那么点a的父亲到点a只有一条路,所以只要用f数组存一个子树外的最大值,剩下的两个就是子树里面的最大的两个距离,结果就是a+2*b+c,看不懂的话就看上面推荐的论文吧,我比较菜。
代码:(我可是加了注释的良心人)
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<vector>
#include<set>
#include<cstdio>
#include<string>
#include<deque>
using namespace std;
typedef long long LL;
#define eps 1e-8
#define INF 0x3f3f3f3f
#define maxn 200005
/*struct point{
int u,w;
};
bool operator <(const point &s1,const point &s2)
{
if(s1.w!=s2.w)
return s1.w>s2.w;
else
return s1.u>s2.u;
}*/
struct node{
int v,next;
LL w;
}edge[maxn<<];
int head[maxn];
int n,m,k,t,cnt;
LL mx1[maxn],mx2[maxn],mx3[maxn],f[maxn],ans;//mx1[i]代表点i为根到所有儿子距离的最大值
//f[i]表示点i到点i为根的子树外的所有点的距离最大值
bool vis[maxn];
void DFS(int u){//求出以u为根的子树中,点u到它的儿子节点的所有距离里面的最大三个
vis[u]=true;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].v;
LL w=edge[i].w;
if(!vis[v]){
DFS(v);
mx3[u]=max(mx3[u],mx1[v]+w);//这里为什么这么写需要自己推敲一下
if(mx3[u]>mx2[u]) swap(mx2[u],mx3[u]);
if(mx2[u]>mx1[u]) swap(mx1[u],mx2[u]);
}
}
}
void DFS1(int u){//往父节点方向找子树之外的点到点u的最大距离
vis[u]=true;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].v;
LL w=edge[i].w;
if(!vis[v]){
f[v]=f[u]+w;
if(mx1[u]==mx1[v]+w)//离点u距离最大的儿子节点在以点v为根节点的子树里面
f[v]=max(f[v],mx2[u]+w);
else
f[v]=max(f[v],mx1[u]+w);
DFS1(v);
}
}
}
void cal(LL a,LL b,LL c){
if(a<b) swap(a,b);//排序
if(a<c) swap(a,c);
if(b<c) swap(b,c);
ans=max(ans,a+*b+c);
}
void init(){
memset(head,-,sizeof(head));
memset(mx1,,sizeof(mx1));
memset(mx2,,sizeof(mx2));
memset(mx3,,sizeof(mx3));
memset(f,,sizeof(f));
cnt=ans=;
}
void add(int u,int v,LL w){
edge[++cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt;
}
int main()
{
scanf("%d%d",&n,&m);
init();
int u,v;
LL w;
for(int i=;i<=m;i++){
scanf("%d%d%lld",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
memset(vis,false,sizeof(vis));
DFS();
memset(vis,false,sizeof(vis));
DFS1();
for(int i=;i<=n;i++){//以每个点为分叉点的情况都算一遍
if(f[i]>mx3[i])
cal(mx1[i],mx2[i],f[i]);
else
cal(mx1[i],mx2[i],mx3[i]);
}
printf("%lld\n",ans);
return ;
}
树形DP(记忆化搜索) HYSBZ - 1509的更多相关文章
- 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索
题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...
- [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树
树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...
- 刷题总结——二叉苹果树(ssoj树形dp+记忆化搜索)
题目: 题目背景 URAL:http://acm.timus.ru/problem.aspx?space=1&num=1018 题目描述 有一棵苹果树,如果树枝有分叉,一定是分 2 叉(就是说 ...
- 刷题总结——选课(ssoj树形dp+记忆化搜索+多叉树转二叉树)
题目: 题目描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了 N(N<300)门的选修课程,每个学生可选课程的数量 M 是给定的.学生选修了这M门课 ...
- 加分二叉树 vijos1991 NOIP2003第三题 区间DP/树形DP/记忆化搜索
描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都有一 ...
- 【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索
[题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...
- poj1664 dp记忆化搜索
http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...
- 状压DP+记忆化搜索 UVA 1252 Twenty Questions
题目传送门 /* 题意:给出一系列的01字符串,问最少要问几个问题(列)能把它们区分出来 状态DP+记忆化搜索:dp[s1][s2]表示问题集合为s1.答案对错集合为s2时,还要问几次才能区分出来 若 ...
- ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. Poor Ramzi -dp+记忆化搜索
ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. ...
- POJ 1088 DP=记忆化搜索
话说DP=记忆化搜索这句话真不是虚的. 面对这道题目,题意很简单,但是DP的时候,方向分为四个,这个时候用递推就好难写了,你很难得到当前状态的前一个真实状态,这个时候记忆化搜索就派上用场啦! 通过对四 ...
随机推荐
- 【ASP.NET 插件】分享一个可视化HTML编辑器 CKEditor.NET
因为公司网站的可视化HTML编辑器IE兼容性问题,js报错不能使用,于是在网上找到了个还行的,图片本地上传的话直接把图片拖到编辑窗口就可以了.这个编辑器是在开源中国看到的,个人觉得还不错! CKEdi ...
- Jquery 属性选择器&设置元素属性
什么是属性选择器呢?感觉理解起来有点难,举个例子就很容易明白了,<div id="ajaxa"></div>这里的id就是属性,这下就很容易理解了, jqu ...
- 试用bus hound来分析STM32CubeMX来生成USB_HID_Mouse工程
Bus Hound (x64). Complements of www.perisoft.net STM32_HID_mouse Device - Device ID (followed by the ...
- elasticsearch相关
- C++ primer ch6 函数基础-1
1.形参和实参:编译器并没有规定实参的求值顺序. 类似下面的代码,其行为是未定义的: ; printf("%d %d\n",++i,++i); 2.变量的初始化: 如果内置类型的变 ...
- 尚硅谷springboot学习14-自动配置原理
配置文件能配置哪些属性 配置文件能配置的属性参照 自动配置的原理 1).SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration 2).@Ena ...
- Delphi与各数据库数据类型比较
Delphi数据类型与各数据库数据类型对比如下表,如有具体说明见表中脚注: Delphi Type Oracle Types SQL Server Types MySQL Types [1] Inte ...
- FlashDevelop 发布SWC
环境配置: 1.安装32位Java,经测试可用的 链接:http://pan.baidu.com/s/1i4CraXR 密码:xuud 2.ant,链接:http://pan.baidu.com/s/ ...
- Jquery select chosen 插件注意点
<select style="width:200px;" name="carId" data-placeholder="选择车辆牌照" ...
- 11.枚举类.md
目录 1.定义: 2.枚举类和普通类的区别: 2.1枚举类的简单构建: 2.2枚举类的成员变量.方法和构造 2.3实现接口的枚举类 1.定义: 2.枚举类和普通类的区别: 枚举类的默认修饰符是 pub ...