💻STUDY/BOJ

[BOJ] 1167. 트리의 지름(C++)

coldNoodlePigeon 2022. 7. 3.
  • 코딩 초보

 


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

댓글