Cod sursa(job #2040850)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 16 octombrie 2017 17:01:22
Problema Zvon Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
/*
I love you Rose
I hope you love me too
*/
#include<bits/stdc++.h>
using namespace std;
class InParser {
private:
    FILE *fin;
    char *buff;
    int sp;

    char read_ch() {
        ++sp;
        if (sp == 4096) {
            sp = 0;
            fread(buff, 1, 4096, fin);
        }
        return buff[sp];
    }

public:
    InParser(const char* nume) {
        fin = fopen(nume, "r");
        buff = new char[4096]();
        sp = 4095;
    }

    InParser& operator >> (int &n) {
        char c;
        while (!isdigit(c = read_ch()) && c != '-');
        int sgn = 1;
        if (c == '-') {
            n = 0;
            sgn = -1;
        } else {
            n = c - '0';
        }
        while (isdigit(c = read_ch())) {
            n = 10 * n + c - '0';
        }
        n *= sgn;
        return *this;
    }

    InParser& operator >> (long long &n) {
        char c;
        n = 0;
        while (!isdigit(c = read_ch()) && c != '-');
        long long sgn = 1;
        if (c == '-') {
            n = 0;
            sgn = -1;
        } else {
            n = c - '0';
        }
        while (isdigit(c = read_ch())) {
            n = 10 * n + c - '0';
        }
        n *= sgn;
        return *this;
    }
};
InParser f("zvon.in");
ofstream g("zvon.out");
int t,a,b;
int n,ar[100003];
bool wm[100003];
vector<int>v[100003];
vector<int>ar2;
void dfs1(int nod)
{
    ar[nod]=0;
    int m=v[nod].size();
    if(m==0){
        ar[nod]=1;
        return;
    }
    for(int i=0;i<m;++i)
    {
        dfs1(v[nod][i]);
        ar[nod]+=ar[v[nod][i]];
    }
}
int dfs2()
{
    int t=0;
    int d=1;
    while(d<n)
    {
        ++t;
        int prvs=ar2.size();
        for(int i=0;i<prvs;++i)
        {
            int max1=0;
            int who=0;
            int d1=v[ar2[i]].size();
            for(int j=0;j<d1;++j)
                if(wm[v[ar2[i]][j]]==0)
                    if(ar[v[ar2[i]][j]]>max1)
                        max1=ar[v[ar2[i]][j]],who=v[ar2[i]][j];
            if(who!=0){
                ++d;
                ar2.push_back(who);
                wm[who]=1;
            }
        }
    }
    return t;
}
int main()
{
    f>>t;
    for(;t;--t)
    {
        f>>n;
        for(int i=1;i<=n;++i)
            v[i].clear();
        memset(wm,0,100002);
        ar2.clear();
        for(int i=1;i<n;++i)
        {
            f>>a>>b;
            v[a].push_back(b);
        }
        dfs1(1);
        ar2.push_back(1);
        g<<dfs2()<<'\n';
    }
    return 0;
}