백준 28219 - 주유소

Updated:

Categories:

Tags: , , ,

주유소

풀이

DFS탐색으로 트리를 순회한다.
이때, 어떤 서브트리의 루트 u에 대해서 모든 자식들의 길이 중 가장 긴 2개를 a,b라 하자.
$a+b >= k$ 라면 정점 u에는 주유소를 설치해야 해당 서브트리에서 서로 이동할 때 무조건 주유소를 포함함을 보장할 수 있다.
그리고 $dist[u]$를 0으로 초기화해준다.

여기서, $dist[u]$는 정점 u를 루트로 하는 서브트리에서 주유소를 아직 통과하지 못 하는 정점들 중 최대 길이이다.
따라서 주유소를 u에 설치한다면 $dist[u]$는 0이 된다.
주유소를 설치하지 않는다면 $dist[u]$는 u의 모든 자식들의 dist들 중 최댓값 + 1이 되어야 할 것이다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <bits/stdc++.h>

#define endl "\n"
#define all(v) (v).begin(), (v).end()
#define For(i, a, b) for(int i=(a); i<(b); i++)
#define FOR(i, a, b) for(int i=(a); i<=(b); i++)
#define Bor(i, a, b) for(int i=(a)-1; i>=(b); i--)
#define BOR(i, a, b) for(int i=(a); i>=(b); i--)
#define ft first
#define sd second

using namespace std;
using ll = long long;
using lll = __int128_t;
using ulll = __uint128_t;
using ull = unsigned long long;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using ti3 = tuple<int, int, int>;
using tl3 = tuple<ll, ll, ll>;

template<typename T> using ve = vector<T>;
template<typename T> using vve = vector<vector<T>>;

template<class T> bool ckmin(T& a, const T& b) { return b < a ? a = b, 1 : 0; }
template<class T> bool ckmax(T& a, const T& b) { return a < b ? a = b, 1 : 0; }

const int INF = 987654321;
const int INF0 = numeric_limits<int>::max();
const ll LNF = 987654321987654321;
const ll LNF0 = numeric_limits<ll>::max();

int n, k;
vve<int> g;
ve<int> d;

int dfs(int p, int u) {
    int ret = 0;
    pii a = {0,0};
    for(int v : g[u]) {
        if(v == p) continue;
        ret += dfs(u,v);
        ckmax(d[u], d[v]+1);
        if(d[v] > a.ft) { a.sd = a.ft; a.ft = d[v]; }
        else if(d[v] > a.sd) a.sd = d[v];
    }

    if(a.ft + a.sd >= k) { ret++; d[u]=0; }
    return ret;
}

void solve() {
    cin >> n >> k;
    g = vve<int>(n+1);
    d = ve<int>(n+1,1);

    FOR(_,1,n-1) {
        int u, v; cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    cout << dfs(1,1) << endl;
}

int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    int TC=1;
//    cin >> TC;
    FOR(tc, 1, TC) {
//        cout << "Case #" << tc << ": ";
        solve();
    }


    return 0;
}

Leave a comment