메뉴 건너뛰기

Programing

BAEKJOON

1839

관리자 2020.04.11 09:12 조회 수 : 44

C++

#include <cstdio>

#include <vector>

#include <cstring>

#include <algorithm>

 

using namespace std;

int N;

vector<int> vec[10010];

 

int calc_cnt(int v, int p)

{

    int cnt = 0;

    for(auto c : vec[v])

    {

        if(c == p)

            continue;

        cnt += calc_cnt(c, v);

    }

 

    if(p == 0)

        cnt += (vec[v].size() + 1) / 2;

    else

        cnt += (vec[v].size() - 1) / 2;

    return cnt;

}

 

int check_len(int idx, const vector<int>& len_vec, int m)

{

    int s=0,e=len_vec.size()-1;

    while(s<e){

        if(s==idx)

            s++;

        if(e==idx)

            e--;

        if(len_vec[s]+len_vec[e]>m)

            return 0;

        s++, e--;

    }

    return 1;

}

 

int serch(int v,int p, int m){

    vector<int> len_vec;

    for(auto c : vec[v])

    {

        if(c == p)

            continue;

        int len = serch(c, v, m);

        if(len == -1)

            return -1;

        len_vec.push_back(len + 1);

    }

 

    if(p && len_vec.size() % 2 == 0)

        len_vec.push_back(0);

 

    sort(len_vec.begin(), len_vec.end());

 

    if(p == 0)

    {

        if(len_vec.size() % 2)

        {

            if(len_vec.back() > m)

                return - 1;

            len_vec.pop_back();

        }

 

        for(int s = 0, e = len_vec.size()-1; s < e; s++, e--)

        {

            if(len_vec[s]+len_vec[e]>m)

                return -1;

        }

        return 0;

    }

 

    int lb = 0, ub = len_vec.size();

    while(lb < ub)

    {

        int idx = (lb + ub) / 2;

        if(check_len(idx, len_vec, m))

            ub = idx;

        else

            lb = idx + 1;

    }

 

    if(ub == (int)len_vec.size())

        return -1;

    return len_vec[ub] > m ? -1 : len_vec[ub];

}

 

int main()

{

   scanf("%d",&N);

   for(int i=1;i<=N-1;i++){

        int a,b;

        scanf("%d %d",&a,&b);

        vec[a].push_back(b);

        vec[b].push_back(a);

   }

 

   printf("%d ",calc_cnt(1, 0));

 

   int lb = 1, ub = N - 1;

   while(lb < ub)

   {

       int m = (lb + ub) / 2;

       if(serch(1, 0, m) == -1)

            lb = m + 1;

       else

            ub = m;

   }

   printf("%d", ub);

    return 0;

}

 
번호 제목 글쓴이 날짜 조회 수
공지 안내사항 관리자 2019.12.21 163
45 2468 관리자 2019.12.21 8
44 2458 관리자 2020.04.11 44
43 2457 관리자 2020.04.11 47
42 2454 관리자 2020.04.11 43
41 2450 관리자 2020.04.11 40
40 2339 관리자 2020.04.11 41
39 2307 관리자 2019.12.21 8
38 2250 관리자 2019.12.21 8
37 2233 관리자 2019.12.21 6
36 2170 관리자 2019.12.21 7
35 2132 관리자 2019.12.21 7
34 2096 관리자 2019.12.21 8
33 2042 관리자 2020.04.11 45
32 2003 관리자 2020.04.11 39
31 1991 관리자 2019.12.21 8
30 1967 관리자 2019.12.21 6
29 1966 관리자 2020.04.11 45
28 1946 관리자 2020.04.11 39
27 1874 관리자 2020.04.11 43
» 1839 관리자 2020.04.11 44
25 17611 관리자 2019.12.21 7
24 1753 관리자 2019.12.21 8
23 1742 관리자 2020.04.11 6
22 1720 관리자 2020.04.11 6
21 16210 관리자 2020.04.11 57
20 16201 관리자 2020.04.11 44
19 15971 관리자 2019.12.21 6
18 14865 관리자 2019.12.21 8
17 14503 관리자 2019.12.21 7
16 14502 관리자 2019.12.21 6
위로