Cod sursa(job #1566713)

Utilizator DiClauDan Claudiu DiClau Data 12 ianuarie 2016 15:08:10
Problema Zvon Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
const int N = 100005;
struct memo
{
    int x, y, nr;
};
int vf[N], lst[N], urm[N], m, maxim = -1, c[N];
memo v[N];
void adauga (int x, int y)
{
    vf[++m] = y;
    urm[m] = lst[x];
    lst[x] = m;
}
void dfs (int x, int t)
{
    if (maxim < t)
        maxim = t;
    int y, p;
    p = lst[x];
    while (p != 0)
    {
        y = vf[p];
        dfs (y, t + 1);
        t++;
        p = urm[p];
    }
}
void dfs2 (int x)
{
    int y, p, nr = 0;
    p = lst[x];
    while (p != 0)
    {
        y = vf[p];
        dfs2(y);
        nr += c[y] + 1;
        p = urm[p];
    }
    c[x] = nr;
}
void curatare1 (int n)
{
    int i;
    for (i = 1; i <= n; i++)
    {
        lst[i] = 0;
        urm[i] = 0;
    }
    m = 0;
    maxim = -1;
}
void curatare2 (int n)
{
    int i;
    for (i = 1; i <= n; i++)
    {
        v[i].x = 0;
        v[i].y = 0;
        v[i].nr = 0;
    }
}
bool cmp (memo a, memo b)
{
    if (a.nr > b.nr)
        return true;
    return false;
}
int main ()
{
    FILE *in, *out;
    in = fopen ("zvon.in", "r");
    out = fopen ("zvon.out", "w");
    int teste, t;
    fscanf (in, "%d", &teste);
    int n, i;
    for (t = 1; t <= teste; t++)
    {
        fscanf (in, "%d", &n);
        curatare1 (n);
        curatare2 (n);
        for (i = 1; i <= n - 1; i++)
        {
            fscanf (in, "%d%d", &v[i].x, &v[i].y);
            adauga (v[i].x, v[i].y);
        }
        dfs2(1);
        for (i = 1; i <= n - 1;i ++)
            v[i].nr = c[v[i].y];
        sort (v + 1, v + n + 1, cmp);
        curatare1 (n);
        for (i = n - 1; i >= 1; i--)
            adauga(v[i].x, v[i].y);
        dfs(1, 0);
        fprintf (out, "%d\n", maxim);
    }
    return 0;
}