Cod sursa(job #1891144)

Utilizator dragos_vecerdeaVecerdea Dragos dragos_vecerdea Data 23 februarie 2017 19:17:29
Problema Zvon Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <stdio.h>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
FILE *fin = fopen("zvon.in", "r");
FILE *fout = fopen("zvon.out", "w");
#define SIGMA 100001
vector <int> fiu[SIGMA];
char efiu[SIGMA];
char vizitat[SIGMA];
int v[SIGMA];
int antidfs[SIGMA];
int raspuns[SIGMA];
int main()
{
    int n,t;
    int trebuie;
    fscanf(fin, "%d", &t);
    for(int q=1;q<=t;q++)
    {
        fscanf(fin, "%d", &n);
        for(int i=1;i<n;i++)
        {
            int x,y;
            fscanf(fin, "%d%d", &x,&y);
            fiu[x].push_back(y);
            efiu[y]=1;
        }
        stack <int> frontiera;
        for(int i=1;i<=n;i++)
        {
            if(efiu[i]==0)
            {
                frontiera.push(i);
                trebuie=i;
                vizitat[i]=1;
            }
        }
        int ramas=1;
        while(!frontiera.empty())
        {
            int nod = frontiera.top();
            frontiera.pop();
            antidfs[ramas]=nod;
            ramas++;
            for(int node : fiu[nod])
            {
                if(vizitat[node]==0)
                {
                    vizitat[node]=1;
                    frontiera.push(node);
                }
            }
        }
    ramas--;
    int maxim=0;
    int cnt=0;
    for(int i=ramas;i>=1;i--)
    {
        cnt=0;
        maxim=0;
        for(auto node : fiu[i])
        {
            cnt++;
            v[cnt] = raspuns[node];
        }
        sort(v+1,v+cnt+1);
        for(int j=1;j<=cnt;j++)
        {
            if(maxim<cnt-j+1+v[j]) maxim = v[j]+cnt-j+1;
        }
        raspuns[i]=maxim;
    }
    fprintf(fout, "%d\n", raspuns[trebuie]);
    for(int i=1;i<=n;i++)
    {
        vizitat[i]=0;
        efiu[i]=0;
        raspuns[i]=0;
        while(!fiu[i].empty()) fiu[i].pop_back();
    }
    }
    return 0;
}