[hihocoder 1050]求树的最长链
题目链接: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]求树的最长链的更多相关文章
- VIJOS1107 求树的最长链
vijos1107环游大同80天 学习了一下求树的最长链的方法 最简单的思路就是两次dfs 两次dfs分别有什么用呢? 第一次dfs,求出某个任意的点能到达的最远的点 第二次dfs,从所搜到的最远的点 ...
- $Loj10155$ 数字转换(求树的最长链) 树形$DP$
loj Description 如果一个数x的/约数和/y(不包括他本身)比他本身小,那么x可以变成y,y 也可以变成x.限定所有数字变换在不超过n的正整数范围内进行,求不断进行数字变换且不出现重复数 ...
- HDU4607(求树中的最长链)
题目:Park Visit 题意:给定一棵树,从树中的任意选一个顶点出发,遍历K个点的最短距离是多少?(每条边的长度为1) 解析:就是求树的最长链,假设求出的树的最长链所包含的点数为m,那么如果K&l ...
- 树的最长链-POJ 1985 树的直径(最长链)+牛客小白月赛6-桃花
求树直径的方法在此转载一下大佬们的分析: 可以随便选择一个点开始进行bfs或者dfs,从而找到离该点最远的那个点(可以证明,离树上任意一点最远的点一定是树的某条直径的两端点之一:树的直径:树上的最长简 ...
- [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分
题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...
- HDU 4607 Park Visit (树的最长链)
Park Visit Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- SPOJ LIS2 Another Longest Increasing Subsequence Problem 三维偏序最长链 CDQ分治
Another Longest Increasing Subsequence Problem Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://a ...
- 2019.01.19 bzoj3653: 谈笑风生(长链剖分优化dp)
传送门 长链剖分优化dpdpdp水题. 题意简述:给一棵树,mmm次询问,每次给一个点aaa和一个值kkk,询问满足如下条件的三元组(a,b,c)(a,b,c)(a,b,c)的个数. a,b是c的祖先 ...
- [HDU4607]Park Visit(树上最长链)
HDU#4607. Park Visit 题目描述 Claire and her little friend, ykwd, are travelling in Shevchenko's Park! T ...
随机推荐
- Leecode刷题之旅-C语言/python-83删除排序链表中的重复元素
/* * @lc app=leetcode.cn id=83 lang=c * * [83] 删除排序链表中的重复元素 * * https://leetcode-cn.com/problems/rem ...
- unity独立游戏开发日记2018/09/27
今天优化了下昨天的代码,并且添加了树木和其他资源的生成.还修复了接近石头后,挖掘图标不出现的bug.目前可以在unity中稳定60-70fps. 详看文章:https://www.cnblogs.co ...
- 003---设计首页index页面
在项目的urls.py文件添加一条url from django.contrib import admin from django.urls import path, re_path from app ...
- go学习笔记-结构体
结构体 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 定义 格式 type struct_variable_type struct { member definition; member ...
- python2.7练习小例子(六)
6):题目:斐波那契数列. 程序分析:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.……. ...
- 【转】让Moodle支持多个域名
默认情况下,moodle仅能绑定一个域名.但是由于学校网络分内网和外网,总希望如果是外网访问的,用外网的域名,用内网访问的,就转到内网的ip.这样访问的速度会更快一些,也减低对防火墙的压力.尤其是当外 ...
- c#一些常用的方法集合
是从一个asp.net mvc的项目里看到的.挺实用的. 通过身份证号码获取出生日期和性别 通过身份证号码获取出生日期和性别 #region 由身份证获得出生日期 public static stri ...
- c++ class as sort function
// constructing sets #include <iostream> #include <set> #include <string.h> bool f ...
- 【题解搬运】PAT_A1020 树的遍历
题目 Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder an ...
- ubuntu安装显卡驱动和cuda
NVIDIA-linux.run安装后,会出现登录页面循环,解决办法是在运行命令后加入-no-opengl-files 打开nvidia x server Settings软件,显示:You do n ...