1814 最长链

时间限制: 1 s

空间限制: 256000 KB

题目等级 : 钻石 Diamond

题目描述 Description

现给出一棵N个结点二叉树,问这棵二叉树中最长链的长度为多少,保证了1号结点为二叉树的根。

输入描述 Input Description

输入的第1行为包含了一个正整数N,为这棵二叉树的结点数,结点标号由1至N。

接下来N行,这N行中的第i行包含两个正整数l[i], r[i],表示了结点i的左儿子与右儿子编号。如果l[i]为0,表示结点i没有左儿子,同样地,如果r[i]为0则表示没有右儿子。

输出描述 Output Description

输出包括1个正整数,为这棵二叉树的最长链长度。

样例输入 Sample Input

5

2 3

4 5

0 6

0 0

0 0

样例输出 Sample Output

4

数据范围及提示 Data Size & Hint

【样例说明】

4-2-1-3-6为这棵二叉树中的一条最长链。

【数据规模】

对于10%的数据,有N≤10;

对于40%的数据,有N≤100;

对于50%的数据,有N≤1000;

对于60%的数据,有N≤10000;

对于100%的数据,有N≤100000,且保证了树的深度不超过32768。

【提示】

关于二叉树:

二叉树的递归定义:二叉树要么为空,要么由根结点,左子树,右子树组成。左子树和右子树分别是一棵二叉树。

请注意,有根树和二叉树的三个主要差别:

1. 树的结点个数至少为1,而二叉树的结点个数可以为0;

2. 树中结点的最大度数没有限制,而二叉树结点的最大度数为2;

3. 树的结点无左、右之分,而二叉树的结点有左、右之分。

关于最长链:

最长链为这棵二叉树中一条最长的简单路径,即不经过重复结点的一条路径。可以容易证明,二叉树中最长链的起始、结束结点均为叶子结点。

分类标签 Tags

最小生成树 图论

  1. /*
  2. 两遍Bfs.
  3. 第一次找最远点.
  4. 第二次用最远点扩展最长链.
  5. */
  6. #include<iostream>
  7. #include<cstdio>
  8. #include<queue>
  9. #include<cstring>
  10. #define MAXN 100001
  11. #define MAXM 1000001*2
  12. using namespace std;
  13. int n,tot,head[MAXN],dis[MAXN],maxtot,maxt;
  14. struct data{
  15. int v,next;
  16. }
  17. e[MAXM];
  18. int read(){
  19. int x=0,f=1;char ch=getchar();
  20. while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
  21. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  22. return x*f;
  23. }
  24. void add(int u,int v){
  25. e[++tot].v=v;
  26. e[tot].next=head[u];
  27. head[u]=tot;
  28. }
  29. int bfs(int u){
  30. queue<int>q;q.push(u);memset(dis,-1,sizeof(dis));dis[u]=0;maxtot=0;
  31. while(!q.empty()){
  32. int u=q.front();q.pop();
  33. for(int i=head[u];i;i=e[i].next){
  34. int v=e[i].v;
  35. if(dis[v]==-1){
  36. dis[v]=dis[u]+1;q.push(v);
  37. if(dis[v]>maxtot){
  38. maxtot=dis[v];maxt=v;
  39. }
  40. }
  41. }
  42. }
  43. return maxt;
  44. }
  45. int main(){
  46. int x;
  47. n=read();
  48. for(int i=1;i<=n;i++)
  49. for(int j=1;j<=2;j++) {
  50. x=read();if(x) add(i,x);add(x,i);}
  51. int t=bfs(1);
  52. bfs(t);
  53. printf("%d",maxtot);
  54. return 0;
  55. }
  1. /*
  2. DP.
  3. */
  4. #include<iostream>
  5. #include<cstdio>
  6. #define MAXN 200001
  7. using namespace std;
  8. int f[MAXN][3],n,m,cut,ans,tot,head[MAXN],son1,son2,son[MAXN][3];
  9. struct data{int v,next;}e[MAXN*2];
  10. int read()
  11. {
  12. int x=0,f=1;char ch=getchar();
  13. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  14. while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar();
  15. return x*f;
  16. }
  17. void add(int u,int v)
  18. {
  19. e[++cut].v=v;
  20. e[cut].next=head[u];
  21. head[u]=cut;
  22. }
  23. int dp1(int u,int fa)
  24. {
  25. int v=son[u][1],v2=son[u][2];
  26. if(v) dp1(v,u);
  27. if(v2) dp1(v2,u);
  28. if(!v&&!v2) return f[u][1]=1;
  29. f[u][1]=max(f[u][1],max(f[v][1]+1,f[v2][1]+1));
  30. f[u][2]=max(f[u][2],f[v][1]+f[v2][1]+2),ans=max(ans,f[u][2]);
  31. return f[u][1];
  32. }
  33. int main()
  34. {
  35. int x,y;
  36. n=read();
  37. for(int i=1;i<=n;i++)
  38. {
  39. x=read(),y=read();
  40. if(i==1) son1=x,son2=y;
  41. if(x) son[i][1]=x,add(i,x);
  42. if(y) son[i][2]=y,add(i,y);
  43. }
  44. ans=max(ans,dp1(1,0));
  45. printf("%d",ans-2);
  46. return 0;
  47. }

Codevs 1814 最长链的更多相关文章

  1. 树形DP codevs 1814 最长链

    codevs 1814 最长链  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题目描述 Description 现给出一棵N个结点二叉树,问这棵二叉树中 ...

  2. codevs 1814 最长链题解

    codevs 1814 最长链题解 题目描述 Description 现给出一棵N个结点二叉树,问这棵二叉树中最长链的长度为多少,保证了1号结点为二叉树的根. 输入描述 Input Descripti ...

  3. codevs——1814 最长链

    1814 最长链  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 现给出一棵N个结点二叉树,问这棵二叉 ...

  4. codevs——T1814 最长链

    http://codevs.cn/problem/1814/  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 De ...

  5. 最长链(codevs 1814)

    题目描述 Description 现给出一棵N个结点二叉树,问这棵二叉树中最长链的长度为多少,保证了1号结点为二叉树的根. 输入描述 Input Description 输入的第1行为包含了一个正整数 ...

  6. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  7. HDU 4612 Warm up tarjan缩环+求最长链

    Warm up Problem Description   N planets are connected by M bidirectional channels that allow instant ...

  8. 长链非编码RNA(lncRNA)

    长链非编码RNA(lncRNA) 转自:http://blog.sina.com.cn/s/blog_909da11301010bkz.html     长链非编码RNA(lncRNA)是一类转录本长 ...

  9. 权威发布:长链非编码RNA命名规则

    转自:http://blog.sina.com.cn/s/blog_8088f3700101pab7.html 权威发布:长链非编码RNA命名规则 对于人类基因命名标准的制定而言,雨果基因命名委员会( ...

随机推荐

  1. HW3.15

    import java.util.Scanner; public class Solution { public static void main(String[] args) { int lotte ...

  2. Codeforces Round #226 (Div. 2)B. Bear and Strings

    /* 题意就是要找到包含“bear”的子串,计算出个数,需要注意的地方就是不要计算重复. */ 1 #include <stdio.h> #include <string.h> ...

  3. 要注意null合并运算符的优先级比+还要低

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:要注意null合并运算符的优先级比+还要低.

  4. cocos2d-x编程的一些小技巧

    转自:http://blog.sina.com.cn/s/blog_61d2d3f50100zgz8.html 一.   CC_ASSERT 或 CCAssert宏 Assert - 断言 使用断言可 ...

  5. PowerShell脚本传递参数

    在编写PowerShell脚本的时候,可以通过给变量赋值的方法输出想要的结果,但这样的话,需要改动脚本内容.其实也可以在脚本中定义参数,然后再在执行脚本的时候对参数赋值,而无需改动脚本内容. 在Pow ...

  6. PHP获取当前url路径的函数及服务器变量

    $_SERVER["QUERY_STRING"],$_SERVER["REQUEST_URI"],$_SERVER["SCRIPT_NAME" ...

  7. 【Android UI设计与开发】之具体解释ActionBar的使用

    具体解释Android中的ActionBar的使用 请尊重他人的劳动成果,转载请注明出处:具体解释Android中的ActionBar的使用 http://blog.csdn.net/fengyuzh ...

  8. Android Studio中使用Gradle打包

    首先要注意一点,Android Studio中把proguard.txt已经命名为proguard-rules.pro,由此可见,採用Gradle打包,混淆规则文件的名称是不重要的.能够自己随便命名. ...

  9. 在Apache Tomcat 7设置redis作为session store

    在Apache Tomcat 7设置redis作为session store  //输出tomcat控制台日志 root@ubuntu:~# cd /usr/tomcat/apache-tomcat- ...

  10. 【Linq递归查找系列】

    Linq递归查找: public IEnumerable<MenuInfo> GetTree(int id, IEnumerable<MenuInfo> lst) { var ...