朝气蓬勃

码农的自我修炼

hiho 11 树的最长路径

问题描述

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

解决方法

首先选择一个点作为树的根节点,对于以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;
}
阅读更多
版权声明:想转就转,记得附上原文链接。 https://blog.csdn.net/galaxy_wolf/article/details/49953153
文章标签: dfs
个人分类: hiho
上一篇hiho 10 二叉树的遍历
下一篇hiho 12 树的dp
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭