Cod sursa(job #2312838)

Utilizator HaesteinnSabau Florin Vlad Haesteinn Data 5 ianuarie 2019 16:42:03
Problema Diametrul unui arbore Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("darb.in");
ofstream fout("darb.out");

vector<int> son[100002];
int n;

int toLeaf[100002];
int maxLength=0;

int calcToLeaf(int s)
{
    toLeaf[s]=0;
    for(auto u:son[s])
        toLeaf[s]=max(toLeaf[s],calcToLeaf(u)+1);
    maxLength=max(maxLength,toLeaf[s]);
    return toLeaf[s];
}

void calcMaxLength(int s)
{
    int minMax=-1,maxMax=-1;
    for(auto u:son[s])
        if (toLeaf[u]>minMax)
        {
            minMax=toLeaf[u];
            if(minMax>maxMax)
                swap(minMax,maxMax);
        }
    int sum=2;
    sum+=minMax;
    sum+=maxMax;
    maxLength=max(maxLength,sum);
}


int main()
{
    int maxDepth=0;
    fin>>n;
    for(int i=0;i<n;i++)
    {
        int v,u;
        fin>>v>>u;
        maxDepth=max(maxDepth,u);
        son[v].push_back(u);
    }
    calcToLeaf(1);
    for(int i=1;i<=maxDepth;i++)
        if(son[i].size()>1)
            calcMaxLength(i);
    fout<<maxLength+1;
    return 0;
}