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 100 101 102 103 | #include <stdio.h> #include <vector> #include <utility> #include <queue> using namespace std; vector<vector<int> > heightNd; vector<pair<int, int> > child; int par[10001] = { 0 }; int ndX[10001] = { 0 }; int maxWidth = -1 , mostLevel; void levelWidth(int h) { for (int i = 1; i <= h; i++) { int levelL = 10001, levelR = -1; for (int j = 0; j < heightNd[i].size(); j++) { int idx = heightNd[i][j]; int tmpX = ndX[idx]; if (tmpX < levelL) levelL = tmpX; if (tmpX > levelR) levelR = tmpX; } int tmpWidth = levelR - levelL; if (maxWidth < tmpWidth) { maxWidth = tmpWidth; mostLevel = i; } } } int x = 1; void traverse(int idx) { int l = child[idx].first; int r = child[idx].second; if (l != -1) traverse(l); ndX[idx] = x++; if (r != -1) traverse(r); } int findHeight(int root) { queue<pair<int, int> > q; q.push(make_pair(root, 1)); int h, idx; while (!q.empty()) { idx = q.front().first; h = q.front().second; q.pop(); heightNd[h].push_back(idx); int l = child[idx].first; int r = child[idx].second; if (l != -1) q.push(make_pair(l, h + 1)); if (r != -1) q.push(make_pair(r, h + 1)); } return h; } int main() { int n; scanf("%d", &n); child.resize(n + 2); heightNd.resize(n + 2); for (int i = 1; i <= n; i++) { int a, b, c; scanf("%d %d %d", &a, &b, &c); child[a].first = b; child[a].second = c; if (b != -1) par[b] = a; if (c != -1) par[c] = a; } //root 찾기 int root = -1; for (int i = 1; i <= n; i++) if (par[i] == 0) root = i; //높이 찾기 int height = findHeight(root); //순회하면서 좌표 갱신하기 traverse(root); //각 레벨 당 최대 너비 찾기 levelWidth(height); printf("%d %d", mostLevel, maxWidth + 1); } | cs |
1. 중위순회를 통해 x 를 갱신한다
2. 각 레벨별로 최좌측, 최우측 x 좌표를 구한다
>> 이 두 가지를 떠올리는게 쉽지 않아서 다른 블로그를 참조했다
중요!!
아 그리고!
순회를 할때는 무조건 DFS를 사용해야 한다
BFS로는 절대 못품!
'알고리즘 > DFS' 카테고리의 다른 글
(시간초과) 2146 다리만들기 (0) | 2020.01.18 |
---|---|
14502 연구실 (0) | 2020.01.17 |
4677 Oil Deposit (0) | 2020.01.14 |
2468 안전영역 (0) | 2020.01.14 |
2798 블랙잭 (0) | 2019.09.15 |