TyvjP1520 树的直径(模板)
来源:互联网 发布:照片转十字绣软件 编辑:程序博客网 时间:2024/05/29 02:20
题目链接
分析:
我曾经谈过树的直径
但是只停留在理论阶段,不会实现
今天就来填这个史前巨坑
我在blog提到过:
设计状态:
f[i]表示i这棵子树中经过i的最长路径(可以经过i也可以是i作为途中一点)
g[i]表示i这棵子树中,以i为端点的最长路径
f[fa]=max(firstmax{w(fa,u)+g[u]},0)+max(secondmax{w(fa,u)+g[u]},0)
g[fa]=max{w(fa,u)+g[u]}
然而我发现如果真的按照上述的方程转移的话,就很tomato难受
我们可以简化一下状态:
f[i]表示i这棵子树中,以i为端点的最长链
g[i]表示i这棵子树中,以i为端点的次长链
转移的时候,用“每一棵子树的最长链+子树和父亲的连边”来更新父亲的f和g数组
这样当前点对答案的贡献就是f[i]+g[i]
复杂度:O(n)
这里写代码片#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int N=100010;int f[N],g[N];struct node{ int x,y,nxt,v;};node way[N<<1];int st[N],tot=0,ans=0,n;void add(int u,int w,int z){ tot++; way[tot].x=u;way[tot].y=w;way[tot].v=z;way[tot].nxt=st[u];st[u]=tot;}void dfs(int now,int fa){ g[now]=0; f[now]=0; for (int i=st[now];i;i=way[i].nxt) if (way[i].y!=fa) { dfs(way[i].y,now); int len=way[i].v+f[way[i].y]; if (len>f[now]) { g[now]=f[now]; f[now]=len; } else if (len>g[now]) { g[now]=len; } } ans=max(ans,f[now]+g[now]);}int main(){ scanf("%d",&n); for (int i=1;i<n;i++) { int u,w,z; scanf("%d%d%d",&u,&w,&z); add(u,w,z); add(w,u,z); } dfs(1,0); printf("%d",ans); return 0;}
阅读全文
0 0
- TyvjP1520 树的直径(模板)
- 【模板】树的直径
- 树的直径模板
- 树的直径模板
- 树的直径(模板)
- 树的直径模板~~最长路径
- POJ1985Cow Marathon(求树的直径模板)
- poj 1985 树的直径模板题
- NOIP 冲刺 模板:树的直径
- 【原创】模板-树的前中后序遍历,树的重心直径
- HDU 2196 Computer(树的直径的模板题)
- 拓扑排序,树的直径模板(CF14D 枚举删边)
- POJ 1985--Cow Marathon【树的直径 && 模板】
- POJ 1985-Cow Marathon【树的直径模板】
- poj 1958 Cow Marathon(树的直径,模板题)
- poj 1985 Cow Marathon (树的直径 模板题)
- bzoj3124 [Sdoi2013]直径 树的直径
- 【模板】树的直径 DP (模板题:XJOI数字转换)
- Debian使用的dpkg与apt-get软件管理机制详解
- No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt
- mysql 存小数用decimal
- Javascript学习总结--数据类型
- 【Android】自定义View-为View加上边框
- TyvjP1520 树的直径(模板)
- Linux下安装Wordpress
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 Coconut
- 数据结构——复习笔记(广工版)
- 多个微服务在docker中运行,且互相调用,解决他们之间的connection问题
- 内存中的数组
- # Java实现冒泡排序—详细解析优化版冒泡
- 第四周项目2
- Grandpa's Estate POJ