백준 1167 트리의 지름 C++

2023. 9. 13. 21:11알고리즘문제 풀이/백준

문제

트리의 지름이란, 트리에서 임의의 두 점 사이의 거리 중 가장 긴 것을 말한다. 트리의 지름을 구하는 프로그램을 작성하시오.

입력

트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지 매겨져 있다.

먼저 정점 번호가 주어지고, 이어서 연결된 간선의 정보를 의미하는 정수가 두 개씩 주어지는데, 하나는 정점번호, 다른 하나는 그 정점까지의 거리이다. 예를 들어 네 번째 줄의 경우 정점 3은 정점 1과 거리가 2인 간선으로 연결되어 있고, 정점 4와는 거리가 3인 간선으로 연결되어 있는 것을 보여준다. 각 줄의 마지막에는 -1이 입력으로 주어진다. 주어지는 거리는 모두 10,000 이하의 자연수이다.

출력

첫째 줄에 트리의 지름을 출력한다.

알고리즘 분류

풀이

트리를 vector, pair을 이용하여 표현한다.

vector은 노드 추가와 제거가 용이하게 하기 위해 이용하고 

pair은 트리의 연결상태를 나타내기 위해, 즉 특정 node와 연결된 node 번호와 weight를 같이 입력하기 위해 주어진다.

dfs(1,0)

임의의 정점 1에서 가장 거리가 먼 정점, end point를 얻는다.

dfs(end point, 0)

end point에서 가장 거리가 먼 정점을 구할 수 있고  이 둘은 각자가 제일 먼 곳에 위치한다. 

따라서 이 둘의 길이가 트리의 지름이 된다.

 

#include <iostream>
#include <string.h>
#include <vector>
using namespace std;

int visited[100001] = { 0 };
vector<pair<int, int>> node[100001];

int tree_diameter = 0; //the diameter of tree
int end_point = 0; //end point

//DFS
void dfs(int point, int length) {

	if (visited[point])
		return;

	visited[point] = 1;
	if (tree_diameter < length) {
		tree_diameter = length;
		end_point = point;
	}

	for (int i = 0; i < node[point].size(); i++) {
		dfs(node[point][i].first, length + node[point][i].second);
	}
}

int main() {

	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	int v; // v is the number of nodes
	cin >> v;

	
	for (int i = 0; i < v; i++) {
		int node1; //node1, node2, the weight of nodes
		cin >> node1;
		while (1) {
			int node2, weight; //node2, the weight of nodes
			cin >> node2; 
			if (node2 == -1) {
				break;
			}
			cin >> weight;
			node[node1].push_back(make_pair(node2, weight));
			node[node2].push_back(make_pair(node1, weight));
		}
	}

	memset(visited, 0, sizeof(visited));
	//get end point
	dfs(1, 0);

	tree_diameter = 0;
	memset(visited, 0, sizeof(visited));

	//get the diameter of tree
	dfs(end_point, 0);
	cout << tree_diameter << "\n";

	return 0;
}

'알고리즘문제 풀이 > 백준' 카테고리의 다른 글

백준 1197 최소 스패닝 트리 C++  (0) 2023.09.14
백준 1181 단어 정렬 C++  (0) 2023.09.13
백준 1157 단어 공부 C++  (0) 2023.09.12
백준 1152 단어의 개수 Python  (0) 2023.09.11
백준 1149 RGB 거리 C++  (0) 2023.09.11