Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 73487ff

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /