백준 28219 - 주유소
Updated:
Categories: Problem Solving
주유소
풀이
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