BOJ15900: 나무 탈출

https://www.acmicpc.net/problem/15900

  • 리프노드로부터 루트까지의 거리를 구하는 문제림
  • 양방향 그래프면 루트와 리프노드의 Degree가 1임
  • O(N)으로 손쉽게 풀림
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
#include <bits/stdc++.h>
using namespace std;

class LeafDist {
  int N;
  vector<vector<int>> adj;
public:
  void input();
  long long dfs(int n, int d, int p = -1);
};

int main() {
  LeafDist ld;
  ld.input();
  int ret = ld.dfs(1,0);
  if(ret % 2) cout << "Yes";
  else cout << "No";
}

void LeafDist::input() {
  scanf("%d", &N);
  adj.resize(N+1);
  for(int i = 0, a, b; i < N-1; i++) {
    scanf("%d%d", &a, &b);
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
}

long long LeafDist::dfs(int n, int d, int p) {
  if(adj[n].size() == 1 && n != 1)
    return d;
  long long ret = 0;
  for(int m : adj[n])
    if(m != p)
      ret += dfs(m, d+1, n);
  return ret;
}