您的位置:首页 > 其它

hiho 11 树的最长路径

2015-11-20 23:02 393 查看

问题描述

树中两个结点之间的最长距离, 距离指两个节点之间的边数。

解决方法

首先选择一个点作为树的根节点,对于以t为根的子树,L1和L2表示从t到叶子节点的最长距离和次长距离,那么子树对应的结果是 L1+L2;

树在存储时,可以按照无向边存储,在dfs访问时,传入父节点的指针,遍历时,如果是父节点就跳过。

#include <vector>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
enum{maxn = 100000+5};
vector<int> tree[maxn];
int res = -1;
int findMax(int t, int pre)
{
int first = -1, sec = -1;
for (int i=0; i< tree[t].size(); i++)
{
if (tree[t][i] != pre)
{
sec = max(sec, findMax(tree[t][i], t));
if (first < sec)
swap(first, sec);
}
}
res = max(res, first+sec+2);
return first +1;
}

#define OJ
int main()
{
#ifndef OJ
freopen("in.txt", "r", stdin);
#endif // OJ
int n;
scanf("%d", &n);
for (int i=0; i< n-1; i++)
{
int a, b;
scanf("%d %d", &a, &b);
tree[a].push_back(b);
tree[b].push_back(a);
}
findMax(1, 0);
printf("%d\n", res);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dfs