본문 바로가기

Programming/Algorithm (C++)

[백준 1167] c++ :: 트리의 지름

트리의 지름 성공

 
 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 256 MB 54415 19886 14325 34.008%

문제

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

입력

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

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

출력

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

예제 입력 1 복사

5
1 3 2 -1
2 4 4 -1
3 1 2 4 3 -1
4 2 4 3 3 5 6 -1
5 4 6 -1

예제 출력 1 복사

11

출처

#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

queue<int> q;

typedef pair<int, int> edge;
static vector<vector<edge>>A;
static vector<bool> visited;
static vector<int> m_distance;
void BFS(int node);
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N;
	cin >> N;
	A.resize(N + 1);
	for (int i = 0; i < N; i++)
	{
		int S;
		cin >> S;
		while (true) {
			int E, V;
			cin >> E;
			if (E == -1)break;
			cin >> V;
			A[S].push_back(edge(E, V));
		}
	}
	m_distance = vector<int>(N + 1, 0);
	visited = vector<bool>(N + 1, false);
	BFS(1);
	int Max = 1;
	for (int i = 2; i <= N; i++) {
		if (m_distance[Max] < m_distance[i])
			Max = i;
	}
	fill(m_distance.begin(), m_distance.end(), 0);
	fill(visited.begin(), visited.end(), false);
	BFS(Max);
	sort(m_distance.begin(), m_distance.end());
	cout << m_distance[N] << "\n";
}
void BFS(int node) {
	queue<int> myqueue;
	myqueue.push(node);
	visited[node] = true;

	while (!myqueue.empty()) {
		int now_node = myqueue.front();
		myqueue.pop();
		for (edge i : A[now_node]) {
			if (!visited[i.first]) {
				visited[i.first] = true;
				myqueue.push(i.first);
				m_distance[i.first] = m_distance[now_node] + i.second; //거리 배열 업데이트 
			}
		}
	}
}

'Programming > Algorithm (C++)' 카테고리의 다른 글

[백준 1296] c++ :: 그림  (0) 2024.03.22
[백준 1260] c++ :: DFS와 BFS  (0) 2024.03.17
[백준 5567] c++ :: 결혼식  (1) 2021.04.07
[백준 3085] c++ :: 사탕 게임  (0) 2021.04.07
rush02 정리  (0) 2021.03.16