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<int, int>> 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 |