SP1437 PT07Z - Longest path in a tree

树的直径的模板题。

  1. 从任意一个节点出发(以\(1\)号点为例),找出距离\(1\)号点最远的点\(p\)\(p\)为直径的一个端点
  2. \(d[p]\)\(0\),找出距离\(p\)最远的点\(q\)\((p, q)\) 即为直径的两个端点,\(d[q]\)即为树的直径长度
const int N=10010;
vector<int> g[N];
int d[N];
int n;
int far;

void dfs(int u,int fa)
{
    for(int i=0;i<g[u].size();i++)
    {
        int j=g[u][i];
        if(j == fa) continue;
        d[j]=d[u]+1;
        if(d[j] > d[far])
            far=j;
        dfs(j,u);
    }
}

int main()
{
    cin>>n;

    for(int i=0;i<n-1;i++)
    {
        int a,b;
        cin>>a>>b;
        g[a].pb(b);
        g[b].pb(a);
    }

    dfs(1,-1);
    d[far]=0;
    dfs(far,-1);
    cout<<d[far]<<endl;

    //system("pause");
    return 0;
}
posted @ 2021-01-25 21:42  Dazzling!  阅读(50)  评论(0编辑  收藏  举报