💻STUDY/BOJ
[BOJ] 1167. 트리의 지름(C++)
- 코딩 초보
1167. 트리의 지름 (골드2)
트리의 지름이란, 트리에서 임의의 두 점 사이의 거리 중 가장 긴 것을 말한다. 트리의 지름을 구하는 프로그램을 작성하시오.
트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지 매겨져 있다.
먼저 정점 번호가 주어지고, 이어서 연결된 간선의 정보를 의미하는 정수가 두 개씩 주어지는데, 하나는 정점번호, 다른 하나는 그 정점까지의 거리이다. 예를 들어 네 번째 줄의 경우 정점 3은 정점 1과 거리가 2인 간선으로 연결되어 있고, 정점 4와는 거리가 3인 간선으로 연결되어 있는 것을 보여준다. 각 줄의 마지막에는 -1이 입력으로 주어진다. 주어지는 거리는 모두 10,000 이하의 자연수이다.
첫째 줄에 트리의 지름을 출력한다.
#include <iostream>
#include <vector>
#include <cstring> //memset 사용 위함.
using namespace std;
int visit[100001];
vector <pair<int,int>> graph[100001];
int n,startnode;
int maxdist = 0;
void dfs(int node,int dist) {
if (visit[node]) return;
if (maxdist < dist) {
maxdist = dist;
startnode = node;
}
visit[node] = true;
for (int i = 0; i < graph[node].size(); i++) {
int next = graph[node][i].first;
dfs(next,dist+graph[node][i].second);
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 0; i < n; i++) {
int v;
cin >> v;
int a,c;
while (cin >> a) {
if (a == -1) break;
cin >> c;
graph[v].push_back({ a,c });
graph[a].push_back({ v,c });
}
}
dfs(1, 0);
memset(visit, 0, sizeof(visit));
maxdist = 0;
dfs(startnode, 0);
cout << maxdist << '\n';
return 0;
}
처음 탐색때 가장 먼 거리에 있는 노드를 DFS탐색을 통해 찾도록 한다. 가장 먼 거리에 있는 노드를 startnode로 저장하고, maxdist를 다시 0, visit 배열을 0으로 초기화하였다. (다시 탐색하여 최대 maxdistance, diameter을 구해야하므로.)
그리고 다시 dfs탐색을 수행하여 maxdist 값을 구한다.
'💻STUDY > BOJ' 카테고리의 다른 글
[BOJ] 15649. N과 M (1) (C++) (0) | 2022.07.07 |
---|---|
[BOJ] 2606. 바이러스 (C++) (0) | 2022.07.03 |
[BOJ] 13023. ABCDE (C++) (0) | 2022.07.01 |
[BOJ] 2644. 촌수계산 (C++) (0) | 2022.06.30 |
[BOJ] 11724. 연결 요소의 개수 (C++) (0) | 2022.06.28 |
댓글