求树的最长链

2次dfs的方法:

 1 void dfs(int u,int step)
 2 {
 3     int tmp=0;
 4     if (step>t)
 5     {
 6         max_dist=step;
 7         max_point=u;
 8     }
 9     for (int i=0;i<ch[u].size();i++)
10     {
11         int v=ch[u][i];
12         if (!visit[v])
13         {
14             visit[v]=true;
15             dfs(v,step+1);
16             visit[v]=false;
17         }
18     }
19 }s

dp方法:

 1 void dfs(int u)
 2 {
 3     int v,max1=-1,max2=-1;
 4     visit[u]=true;
 5     for (int i=0;i<ch[u].size();i++)
 6     {
 7         v=ch[u][i];
 8         if (!visit[v])
 9         {
10             dfs(v);
11             if (d[v]>=max1)
12             {
13                 max2=max1;
14                 max1=d[v];
15             }
16             else if (d[v]>max2)
17                 max2=d[v];
18         }
19     }
20     d[u]=max1+1;
21     ans=max(ans,max1+max2+2);
22 }
时间: 2024-10-06 00:31:02

求树的最长链的相关文章

VIJOS1107 求树的最长链

vijos1107环游大同80天 学习了一下求树的最长链的方法 最简单的思路就是两次dfs 两次dfs分别有什么用呢? 第一次dfs,求出某个任意的点能到达的最远的点 第二次dfs,从所搜到的最远的点倒搜回去. 为什么需要两次呢? 其实很容易想通第一遍dfs的起始点或许并不是最长链的起点 从最远的点倒搜到的最长的链就是所求的解 (因为最长链一定经过这个最远的点啊... 这里注意题目表述: 假设任意的两个风景点都有且仅有一条路径(无回路)相连.显然,任意一个风景点都可以作为游览路线的起点或者终点.

hdu 2196(树的最长链)

题意:输出从一颗树中所有结点出发可以走的最长的路. 思路:先找到树上最长链然后判断两个端点中到每个结点远的距离就是答案. 代码如下: 1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 #include <vector> 6 #include <queue> 7 #include <set> 8

sdut3045迷之图论--(多叉树求最长链)

迷之图论 Time Limit: 1000MS Memory limit: 65536K 题目描述 FF是图论高手,所以我要出图论且不出流问题. 给出一个树,求树的最长链的长度. 输入 多组输入.每组输入的第一行为n(1 <= n <= 100000),代表节点个数,节点编号从1 到n,接下来的n-1行,每行两个正整数u,v,代表u,v之间有一条边相连.保证每组数据都是一棵树. 输出 对于每组数据,输出一个正整数代表答案. 示例输入 121 2 示例输出 12 提示 来源 zmx dfs搜索

BZOJ-2657: [Zjoi2012]旅游(journey) (树形DP求最长链)

2657: [Zjoi2012]旅游(journey) Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1037  Solved: 655[Submit][Status][Discuss] Description 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个凸N边形来表示,N个顶点表示N个入境/出境口.T国包含N-2个城市,每个城市都是顶点均为N

SPOJ LIS2 Another Longest Increasing Subsequence Problem 三维偏序最长链 CDQ分治

Another Longest Increasing Subsequence Problem Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=19929 Description Given a sequence of N pairs of integers, find the length of the longest incre

HDU 4612 Warm up(双连通分量缩点+求树的直径)

思路:强连通分量缩点,建立一颗新的树,然后求树的最长直径,然后加上一条边能够去掉的桥数,就是直径的长度. 树的直径长度的求法:两次bfs可以求,第一次随便找一个点u,然后进行bfs搜到的最后一个点v,一定是直径的一个端点(证明从略),第二次以点v为开头进行bfs,求出的最后一个点,就是直径的另一个端点,记录深度就是我们要求的长度.我这里是使用的bfs+dfs,是一样的,少开一个deep数组,节省一下空间吧…… 其实我一开始是不会求的,我以为随便一个叶子节点就可以做端点,交上去WA,当时还好奇感觉

【BZOJ1912】【Apio2010】巡逻 树上最长链(才不是树的直径呢)

链接: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/45062689"); } 题解: 对于 k==0 的情况: 我们发现遍历一棵树最后回到原点,那么对于所有的边,我们都是走过去,再走回来. 答案 (n?1<<1) 对于 k==1 的情况 设每条边长度为1,然后树上找最长链,

最长链

最长链 题目描述 现给出一棵N个结点二叉树,问这棵二叉树中最长链的长度为多少,保证了1号结点为二叉树的根. 输入描述 输入的第1行为包含了一个正整数N,为这棵二叉树的结点数,结点标号由1至N. 接下来N行,这N行中的第i行包含两个正整数l[i], r[i],表示了结点i的左儿子与右儿子编号.如果l[i]为0,表示结点i没有左儿子,同样地,如果r[i]为0则表示没有右儿子. 输出描述 输出包括1个正整数,为这棵二叉树的最长链长度. 样例输入 5 2 3 4 5 0 6 0 0 0 0 样例输出 4

长链剖分随想

之前写了那么长一篇Blog-现在不如写篇小短文-说一下另一种树链剖分方法--长链剖分的事情.它可以比重链剖分更快地完成一些东西. 树链剖分的原始版本重链剖分非常经典,这里就不从头介绍了. 原本的剖分方法是按照子树大小剖分,与子树点数最多的儿子连成链,所以叫做重链剖分-然后显然就有一个点到根的路径上至多$O(\log n)$条轻边这个性质(因为沿着轻边走,每次子树大小一定小于父亲的一半).有了这个性质就可以做各种路径相关的查询,暴力每次跳到重链开头就好- 而在一些问题里,有这么一种奇妙的剖分方式可