본문 바로가기
알고리즘/BFS

2644 촌수계산

by tryotto 2020. 1. 18.
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <stdio.h>
#include <queue>
#include <utility>
 
using namespace std;
 
int par[105= { 0 };
int depth[105= { 0 };
int man;
 
void depthSearch(int root) {
    queue<pair<intint>> q;
    int deep = 1;
    
    q.push(make_pair(deep, root));
 
    while (!q.empty()) {        
        int idx = q.front().second;
        deep = q.front().first;
 
        if (idx == 0)
            break;
 
        depth[idx] = deep;
        q.pop();
 
        for (int i = 1; i <= man; i++) {
            if (par[i] == idx) {
                q.push(make_pair(deep + 1, i));
            }
        }
        
    }
}
 
int main() {
    scanf("%d"&man);
 
    int a,b;
    scanf("%d %d"&a, &b);
 
    int n;
    scanf("%d"&n);
 
    for (int i = 0; i < n; i++) {
        int c,d;
        scanf("%d %d"&c, &d);
 
        par[d] = c;
    }
 
    //루트 찾기 + 각 노드들의 깊이 갱신
    for (int i = 1; i <= man; i++
        if (par[i] == 0
            depthSearch(i);    
        
    //높이 맞추기
    int len = 0;
    int dpA = depth[a];
    int dpB = depth[b];
    if (dpB > dpA) {
        len = dpB - dpA;
        for(int i=0;i<len;i++) {
            b = par[b];
        }
    }
    else if (dpB < dpA) {
        len = dpA - dpB;
        for(int i=0;i<len;i++) {
            a = par[a];
        }
    }
 
    //다른 조상을 가지고 있을 경우
    int topParA = a, topParB = b;
    while (1) {
        if (par[topParA] == 0)
            break;
         topParA= par[topParA];            
    }
    while (1) {
        if (par[topParB] == 0)
            break;
        topParB = par[topParB];
    }
    if (topParB != topParA) {
        printf("-1");
        return 0;
    }
 
    //최소 공통조상 찾기
    while (a != b) {
        len+=2;
        a = par[a];
        b = par[b];
    }
 
    printf("%d", len);
}
cs



1. BFS 를 이용해서, 각 노드들의 깊이를 체크한다

2. 높이를 맞춰준다

3. 서로 다른 조상을 가진 경우는 제외해준다

4. 같은 부모를 만날때까지 거슬러 올라간다


'알고리즘 > BFS' 카테고리의 다른 글

5014 스타트링크  (0) 2020.01.20
2589 보물섬  (0) 2020.01.19
2146 다리만들기  (0) 2020.01.18
7569 토마토  (0) 2020.01.14
1697 숨바꼭질  (0) 2020.01.14