Skip to content

Commit 73487ff

Browse files
authored
Create BOJ1167.md
1 parent 0c521b9 commit 73487ff

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed

challenges/BOJ1167.md

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
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

Comments
 (0)