|
| 1 | +# 문제 |
| 2 | +트리의 지름 |
| 3 | +## 문제 원본 |
| 4 | +문제의 원본은 [여기서](https://www.acmicpc.net/problem/1167) 확인하세요. |
| 5 | + |
| 6 | +## 분류 |
| 7 | +* 그래프 이론 |
| 8 | + |
| 9 | +# 풀이 |
| 10 | + |
| 11 | +임의의 정점을 골라 가장멀리 떨어진 정점을 구하고 그 정점에서 다시 가장 멀리 떨어진 정점과의 거리를 구한다. |
| 12 | +이렇게 구한 두 정점의 거리는 트리의 지름이 된다. |
| 13 | + |
| 14 | +``` c++ |
| 15 | +#include <iostream> |
| 16 | +#include <vector> |
| 17 | +#include <cstring> |
| 18 | +using namespace std; |
| 19 | + |
| 20 | +class Graph { |
| 21 | +public: |
| 22 | + vector<pair<int, int>> *adj; |
| 23 | + int n; |
| 24 | + |
| 25 | + Graph(int n) { |
| 26 | + this->n = n; |
| 27 | + adj = new vector<pair<int, int>>[n]; |
| 28 | + } |
| 29 | + |
| 30 | + void insertEdge(int u, int v, int w) { |
| 31 | + this->adj[u].push_back(make_pair(v, w)); |
| 32 | + } |
| 33 | + |
| 34 | + void print() { |
| 35 | + for (int i = 0; i < n; i++) { |
| 36 | + for (int j = 0; j < adj[i].size(); j++) { |
| 37 | + cout << i << ", " << adj[i][j].first << ", " << adj[i][j].second << "\n"; |
| 38 | + } |
| 39 | + } |
| 40 | + } |
| 41 | +}; |
| 42 | + |
| 43 | + |
| 44 | +int _max = -0x7fffffff; |
| 45 | +int maxNode = -1; |
| 46 | + |
| 47 | +// 가장 멀리 떨어진 노드와 거리를 구한다. |
| 48 | +int dfs(Graph* g, int u, int distance, bool visited[]) { |
| 49 | + visited[u] = true; |
| 50 | + |
| 51 | + for (int i = 0; i < g->adj[u].size(); i++) { |
| 52 | + pair<int, int> n = g->adj[u][i]; |
| 53 | + if (!visited[n.first]) { |
| 54 | + dfs(g, n.first, distance + n.second, visited); |
| 55 | + } |
| 56 | + } |
| 57 | + |
| 58 | + if (_max < distance) { |
| 59 | + maxNode = u; |
| 60 | + _max = distance; |
| 61 | + } |
| 62 | +} |
| 63 | + |
| 64 | +int main(void) { |
| 65 | + int n; |
| 66 | + cin >> n; |
| 67 | + |
| 68 | + Graph* g = new Graph(n + 1); |
| 69 | + for (int i = 0; i < n; i++) { |
| 70 | + int u, v, w; |
| 71 | + cin >> u; |
| 72 | + |
| 73 | + while (true) { |
| 74 | + cin >> v; |
| 75 | + if (v == -1) break; |
| 76 | + |
| 77 | + cin >> w; |
| 78 | + g->insertEdge(u, v, w); |
| 79 | + } |
| 80 | + } |
| 81 | + |
| 82 | + |
| 83 | + // 아무 정점이나 잡고 가장 멀리 떨어진 정점을 찾는다. |
| 84 | + bool* visited = new bool[g->n + 1]; |
| 85 | + memset(visited, false, g->n); |
| 86 | + dfs(g, 1, 0, visited); |
| 87 | + |
| 88 | + int start = maxNode; |
| 89 | + |
| 90 | + // maxNode, _max 초기화 |
| 91 | + maxNode = -1; |
| 92 | + _max = -0x7fffffff; |
| 93 | + |
| 94 | + // visited 초기화 |
| 95 | + memset(visited, false, g->n); |
| 96 | + |
| 97 | + // 위에서 찾아진 정점에서 가장 멀리 떨어진 정점을 찾는다. |
| 98 | + dfs(g, start, 0, visited); |
| 99 | + |
| 100 | + // 트리의 지름 출력 |
| 101 | + cout << _max << "\n"; |
| 102 | + |
| 103 | + return 0; |
| 104 | +} |
| 105 | +``` |
0 commit comments