Cod sursa(job #1709522)

Utilizator TeamFIIAUAIC FIIHumvee TeamFIIA Data 28 mai 2016 12:43:05
Problema Revolta Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 2.47 kb
#include <iostream>
#include <map>
#include <cstdio>
#include <string>
#include <set>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>

using namespace std;

#define DMAX 100005

typedef long long LL;


vector <int> v[DMAX];

int use[DMAX], lvlmax, diam, diam2, nrMagic, lmax, n;

void dfsF(int nod, int lvl, int ant)
{
    if(lvl==lmax)
    {
        nrMagic++;
    }
    if(lvl>lmax)
    {
        lmax=lvl;
        nrMagic=1;
    }
    for(int i=0;i<v[nod].size();i++)
    {
        if(ant!=v[nod][i])
        dfsF(v[nod][i], lvl+1, nod);
    }

}

void dfs(int k, int lvl, int ant)
{
    if(lvl>lvlmax)
    {
        lvlmax=lvl;
        diam=k;
    }
    for(int i=0;i<v[k].size();i++)
    {
        if(v[k][i]!=ant)
        {
            dfs(v[k][i], lvl+1, k);
        }
    }
}


void dfs2(int k, int lvl, int ant)
{
    if(lvl == lvlmax)
        diam2=k;
    if(lvl>lvlmax)
    {
        lvlmax=lvl;
        diam=k;
        diam2=-1;
    }

    for(int i=0;i<v[k].size();i++)
    {
        if(v[k][i]!=ant)
        {
            dfs2(v[k][i], lvl+1, k);
        }
    }
}

int DFST(int k, int lvl, int ant)
{
    int ok=0;
    if(lvl==lvlmax)
    {
        ok=1;
    }
    for(int i=0;i<v[k].size();i++)
    {
        if(ant!=v[k][i])
        ok=ok|DFST(v[k][i], lvl+1, k);
    }
    if(ok)
        use[k]=lvl;

    return ok;
}

void solve()
{
    int a, b;
    scanf("%d", &n);

    for(int i=1;i<n;i++)
    {
        scanf("%d%d", &a, &b);
        v[a].push_back(b);
        v[b].push_back(a);
    }

    dfs(0, 0, -1);
    int d=diam;
    dfs2(d, 0, -1);

    if(diam2==-1)
    {
        cout<<lvlmax<<'\n';
    }
    else{

    if(lvlmax%2==1)
        cout<<lvlmax-1<<'\n';
    else
    {
        DFST(diam, 0, -1);
        int nod;
        for(nod=0;nod<n;nod++)
        {
            if(use[nod]==lvlmax/2)
                break;
        }

        dfsF(nod, 0, -1);
        if(nrMagic>2) cout<<lvlmax<<'\n';
        else cout<<lvlmax-1<<'\n';
    }

    }


}

void reset()
{
    for(int i=0;i<=n;i++)
    v[i].clear();
    for(int i=0;i<=n+1;i++)
        use[i]=0;
    lvlmax=0, diam=0, diam2=0, nrMagic=0, lmax=0;
}

int main()
{
    freopen("revolta.in","r", stdin);
    freopen("revolta.out","w", stdout);
    int t;
    scanf("%d", &t);

    while(t)
    {
        solve();
        reset();
        t--;
    }


}