题目链接:http://hihocoder.com/problemset/problem/1050

两种方法:

1. 两遍dfs,第一次随便找一个根,找到距离这个根最远的点,这个点必然是最长链的一端。第二次就用这个端点做一遍dfs,最远的点就是另一端。

#include<bits/stdc++.h>
using namespace std; const int maxn=;
int d[maxn];
vector<int> G[maxn]; void dfs(int u,int fa,int now)
{
d[u]=now;
for (int i=;i<G[u].size();i++)
{
int v=G[u][i];
if (v!=fa) dfs(v,u,now+);
}
} int main()
{
int n;
scanf("%d",&n);
for (int i=;i<n-;i++)
{
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(,,);
int ma=,maj=;
for (int i=;i<=n;i++)
{
if (d[i]>ma)
{
ma=d[i];
maj=i;
}
}
dfs(maj,,);
int ans=;
for (int i=;i<=n;i++) ans=max(ans,d[i]);
printf("%d",ans);
return ;
}

2. 树形dp。记dp[i][0/1]表示以i为lca的最长链和次长链的长度,一遍dfs更新就好了。

#include<bits/stdc++.h>
using namespace std; const int maxn=;
int dp[maxn][];
vector<int> G[maxn]; void dfs(int u,int fa)
{
for (int i=;i<G[u].size();i++)
{
int v=G[u][i];
if (v!=fa) dfs(v,u);
}
if (G[u].size()<=)
{
for (int i=;i<G[u].size();i++)
{
int v=G[u][i];
if (v!=fa) dp[u][]=dp[v][]+;
}
}
else
{
for (int i=;i<G[u].size();i++)
{
int v=G[u][i];
if (v!=fa)
{
if (dp[v][]+>dp[u][])
{
dp[u][]=dp[u][];
dp[u][]=dp[v][]+;
}
else dp[u][]=max(dp[v][]+,dp[u][]);
}
}
}
} int main()
{
int n;
scanf("%d",&n);
G[].push_back();
for (int i=;i<n-;i++)
{
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(,);
int ans=;
for (int i=;i<=n;i++) ans=max(ans,dp[i][]+dp[i][]);
printf("%d",ans);
return ;
}

[hihocoder 1050]求树的最长链的更多相关文章

  1. VIJOS1107 求树的最长链

    vijos1107环游大同80天 学习了一下求树的最长链的方法 最简单的思路就是两次dfs 两次dfs分别有什么用呢? 第一次dfs,求出某个任意的点能到达的最远的点 第二次dfs,从所搜到的最远的点 ...

  2. $Loj10155$ 数字转换(求树的最长链) 树形$DP$

    loj Description 如果一个数x的/约数和/y(不包括他本身)比他本身小,那么x可以变成y,y 也可以变成x.限定所有数字变换在不超过n的正整数范围内进行,求不断进行数字变换且不出现重复数 ...

  3. HDU4607(求树中的最长链)

    题目:Park Visit 题意:给定一棵树,从树中的任意选一个顶点出发,遍历K个点的最短距离是多少?(每条边的长度为1) 解析:就是求树的最长链,假设求出的树的最长链所包含的点数为m,那么如果K&l ...

  4. 树的最长链-POJ 1985 树的直径(最长链)+牛客小白月赛6-桃花

    求树直径的方法在此转载一下大佬们的分析: 可以随便选择一个点开始进行bfs或者dfs,从而找到离该点最远的那个点(可以证明,离树上任意一点最远的点一定是树的某条直径的两端点之一:树的直径:树上的最长简 ...

  5. [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分

    题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...

  6. HDU 4607 Park Visit (树的最长链)

    Park Visit Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

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

    Another Longest Increasing Subsequence Problem Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://a ...

  8. 2019.01.19 bzoj3653: 谈笑风生(长链剖分优化dp)

    传送门 长链剖分优化dpdpdp水题. 题意简述:给一棵树,mmm次询问,每次给一个点aaa和一个值kkk,询问满足如下条件的三元组(a,b,c)(a,b,c)(a,b,c)的个数. a,b是c的祖先 ...

  9. [HDU4607]Park Visit(树上最长链)

    HDU#4607. Park Visit 题目描述 Claire and her little friend, ykwd, are travelling in Shevchenko's Park! T ...

随机推荐

  1. 渗透测试实验(i春秋 真的很简单)

    首先利用给的提示: 所以用户名是 ichunqiu 密码是adab29e084ff095ce3eb 可以确定一般密码都是md5的,但是这个20位 应该去掉ada b29e084ff095ce3e才是正 ...

  2. 【Markdown】Markdown的使用(自用)

    # 欢迎使用 Cmd Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 -- 我们为记录 ...

  3. HyperLedger Fabric 1.4 区块链应用场景(3.1)

    比特币是区块链应用最早的场景,随着比特币安全稳定运行多年以后,数字货币的场景应用遍地开花,各种山寨币泛滥,通过ICO(Initial Coin Offering 首次币发行)就能融到大量资金,上市后的 ...

  4. HDU暑假多校第八场G-Card Game

    一.题意 给出N个卡牌,卡牌的正反两面具有两个数字,取值范围为[1,2*n],给出若干个默认正面向上的卡牌,求最小反转多少张卡牌可以使得,每张卡牌朝上的面上都有一个不同的数字,同时满足最小反转次数的反 ...

  5. Javaweb——四则运算---18.11.01

    ---恢复内容开始--- test.jsp <%@ page language="java" contentType="text/html; charset=utf ...

  6. MySQL基础复习

    三范式定义 1NF:每个数据项都是最小单元,不可分割,其实就是确定行列之后只能对应一个数据. 2NF:每一个非主属性完全依赖于候选码(属性组的值能唯一的标识一个元组,但是其子集不可以).  3NF: ...

  7. 公用的cefsharp窗口

    书接上回,.net实现一个nw,一个字,简单. 结构,无废话,上图. 要说这部分上回展示过的,大致结构如此,其实要说清楚结构,还是得从工作流程开始说起 流程 1.通过桌面的快捷方式启动WebOnDes ...

  8. c/c++ 随机数生成

    当程序需要一个随机数时有两种情况下使用: 1.程序中只需使用一次随机数,则调用rand()函数即可 2.程序需要多次使用随机数,那么需要使用srand()函数生成随机数种子在调用rand()函数保证每 ...

  9. Hibernate-ORM:08.Hibernate中的投影查询

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客将叙述hibernate中的投影查询 一,目录: 1.解释什么是投影查询 2.返回Object单个对象 ...

  10. NodeJS微信公众平台开发

    微信是手机用户必备的App,微信最开始只是作为社交通讯应用供用户使用,但随着用户量不断的增加,微信的公众号在微信上表现出来了它强大的一面,微信公众平台具有四大优势:1.平台更加稳固:2.用户关系更加平 ...