Cod sursa(job #1714535)

Utilizator iulianrotaruRotaru Gheorghe-Iulian iulianrotaru Data 8 iunie 2016 17:06:09
Problema Revolta Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 3.21 kb
#include <bits/stdc++.h>
#define Xp 100010
using namespace std;
ifstream f("revolta.in");
ofstream g("revolta.out");
vector<int> G[Xp];
int l[Xp],bestnod;
int v[Xp],best[Xp],down[Xp];
bool mark[Xp];
int dL[Xp],cL[Xp],diL[Xp],bestR[Xp],dR[Xp],cR[Xp],diR[Xp],bestL[Xp];
void DFS(int nod){
    int i,sf=G[nod].size();
    if(l[nod]>l[bestnod])
        bestnod=nod;
    for(i=0;i<sf;i++)
        if(!l[G[nod][i]]){
            l[G[nod][i]]=l[nod]+1;
            DFS(G[nod][i]);
        }
}
int maxi(int a,int b){
    return a<b?b:a;
}
int mini(int a,int b){
    return a>b?b:a;
}
void DFSDown(int nod,int father){
    int i,sf=G[nod].size();
    best[nod]=1;
    for(i=0;i<sf;i++)
        if(!mark[G[nod][i]]&&G[nod][i]!=father){
            DFSDown(G[nod][i],nod);
            best[nod]=maxi(best[nod],best[G[nod][i]]+1);
        }
}
int main(){
    int t,n,i,x,y,first,second,cur,nod,d,curc,sol,lol;
    f>>t;
    while(t--)
    {
        f>>n;
        for(i=1;i<=n;i++) G[i].clear();
        for(i=1;i<n;i++){
            f>>x>>y;
            x++;
            y++;
            G[x].push_back(y);
            G[y].push_back(x);
        }
        memset(l,0,sizeof l);
        l[1]=1;
        bestnod=0;
        DFS(1);
        first=bestnod;
        memset(l,0,sizeof l);
        l[bestnod]=1;
        bestnod=0;
        DFS(first);
        second=bestnod;
        nod=second;
        cur=0;
        memset(mark,0,sizeof mark);
        while(l[nod]!=1){
            cur++;
            mark[nod]=1;
            v[cur]=nod;
            for(i=0,lol=G[nod].size();i<lol;i++)
                if(l[G[nod][i]]==l[nod]-1){
                    nod=G[nod][i];
                    break;
                }
        }
        mark[nod]=1;
        cur++;
        v[cur]=nod;
        d=cur;
        for(i=1;i<=d;i++){
            DFSDown(v[i],0);
            down[i]=best[v[i]]-1;
        }
        dL[1]=0;
        cL[1]=1;
        diL[1]=0;
        bestR[1]=0;
        for(i=2;i<=d;i++){
            dL[i]=maxi(dL[i-1],i-1+down[i]);
            curc=cL[i-1];
            if(i-curc+down[i]<=bestR[i-1]){
                cL[i]=cL[i-1];
                diL[i]=diL[i-1];
                bestR[i]=bestR[i-1];
            }
            else{
                while(i-curc+down[i]>curc-1)
                    curc++;
                cL[i]=curc;
                diL[i]=maxi(curc-1,i-curc+down[i]);
                bestR[i]=i-curc+down[i];
            }
        }
        dR[d]=0;
        cR[d]=d;
        diR[d]=0;
        bestL[d]=0;
        for(i=d-1;i>=1;i--){
            dR[i]=maxi(dR[i+1],d-i+down[i]);
            curc=cR[i+1];
            if(curc-i+down[i]<=bestL[i-1]){
                cR[i]=cR[i-1];
                diR[i]=diR[i-1];
                bestL[i]=bestL[i-1];
            }
            else{
                while(curc-i+down[i]>d-curc)
                    curc--;
                cR[i]=curc;
                diR[i]=maxi(d-curc,curc-i+down[i]);
                bestR[i]=curc-i+down[i];
            }
        }
        sol=d;
        for(i=1;i<d;i++)
            sol=mini(sol,maxi(maxi(dL[i],dR[i+1]),diL[i]+diR[i+1]+1));
        g<<sol<<'\n';
    }
    return 0;
}