hihocoder1050 树中的最长路径
2015-02-20 13:05
232 查看
问题分析:
树中的路径,即是从树上的某个节点起,经过某个转折节点,到达另一个节点这样一条路径。而最长路径就是要找出这些路径中最长的那一条。
算法思路:
对于每个节点,记录下以该节点为根节点的子树中从该节点开始到所有叶子节点的路径中最长的那一条路径长度d1以及次长的那一条路径长度d2(最长和次长两条路径无公共边)。那么对于我们想要解决的问题(树中的最长路径),就只需要枚举每个节点作为转折节点,求出所有d1+d2中的最大值。
关于d1,d2的求解:
对于任意一个节点,其d1值等于其所有子节点最大d1值加1,其d2值等于其除d1值对应的子节点以外的所有子节点最大d1值加1。
特别的,叶子节点d1=d2=0,对于只有一个儿子的节点,d2=0。
我的代码:
[b]题目来源:http://hihocoder.com/problemset/problem/1050
树中的路径,即是从树上的某个节点起,经过某个转折节点,到达另一个节点这样一条路径。而最长路径就是要找出这些路径中最长的那一条。
算法思路:
对于每个节点,记录下以该节点为根节点的子树中从该节点开始到所有叶子节点的路径中最长的那一条路径长度d1以及次长的那一条路径长度d2(最长和次长两条路径无公共边)。那么对于我们想要解决的问题(树中的最长路径),就只需要枚举每个节点作为转折节点,求出所有d1+d2中的最大值。
关于d1,d2的求解:
对于任意一个节点,其d1值等于其所有子节点最大d1值加1,其d2值等于其除d1值对应的子节点以外的所有子节点最大d1值加1。
特别的,叶子节点d1=d2=0,对于只有一个儿子的节点,d2=0。
我的代码:
#include <iostream> #include <vector> #include <algorithm> #include <cstring> using namespace std; #define MAXN 100005 struct Tree { vector<int> v[MAXN]; bool vis[MAXN]; int n, d1[MAXN], d2[MAXN], fa[MAXN]; void init(int _n) { n = _n; for(int i=1; i<=n; ++i) v[i].clear(); memset(&d1[1], 0, n*sizeof(int)); memset(&d2[1], 0, n*sizeof(int)); } void addEdge(int a, int b) { v[a].push_back(b); v.push_back(a); } void getFather(int x, int f) { fa[x] = f; vis[x] = true; for(int i=0; i<v[x].size(); ++i) if(!vis[v[x][i]]) getFather(v[x][i], x); } void post_order(int x) { vis[x] = true; for(int i=0; i<v[x].size(); ++i) if(!vis[v[x][i]]) post_order(v[x][i]); int tmp; for(int i=0; i<v[x].size(); ++i) { if(v[x][i]!=fa[x]&&d1[x]<d1[v[x][i]]+1) { d1[x] = d1[v[x][i]]+1; tmp = v[x][i]; } } for(int i=0; i<v[x].size(); ++i) if(v[x][i]!=fa[x]&&v[x][i]!=tmp&&d2[x]<d1[v[x][i]]+1) d2[x] = d1[v[x][i]]+1; } int getAns() { int ans = 0; for(int i=1; i<=n; ++i) ans = max(ans, d1[i]+d2[i]); return ans; } }tree; int main() { int n, a, b; while(cin>>n) { tree.init(n); for(int i=0; i<n-1; ++i) { cin>>a>>b; tree.addEdge(a, b); } memset(&tree.vis[1], 0, n); tree.getFather(1, -1); memset(&tree.vis[1], 0, n); tree.post_order(1); cout<<tree.getAns()<<endl; } return 0; }
[b]题目来源:http://hihocoder.com/problemset/problem/1050
相关文章推荐
- hihocoder(1050) 树中最长路径
- hihoCoder 1050 : 树中的最长路 (dfs)
- [HihoCoder]#1050 : 树中的最长路
- 字串的连接最长路径查找
- Uva 11324 强连通分量求解 + 缩点——有向无环图求最长路径
- 字串的连接最长路径查找
- 字串的连接最长路径查找
- hihoCoder 1032 最长回文子串
- hdu 1160 dp (二维最长上升子序列 记录路径
- [ACM] POJ 2253 Frogger (最短路径变形,每条通路中的最长边的最小值)
- hihoCoder 1394 : 网络流四·最小路径覆盖 (网络流学习#4 记录)
- 01Trie【p4551(poj3764)】 最长异或路径
- hihocoder 1032 最长回文子串
- leetcode 687. Longest Univalue Path 二叉树最长相等路径+ 深度优先遍历DFS
- 【COGS743】最长k可重区间集问题 最大权不相交路径
- 寻找递减最长路径
- hdu 1160 FatMouse's Speed(最长不下降子序列+输出路径)
- Arbitrage(bellman,最长路径)
- hihocoder 第一周 最长回文字串
- 求二叉树中的第一条最长路径长度,并输出最长路径上的节点