본문 바로가기

백준

백준1967 - 트리의 지름

https://www.acmicpc.net/problem/1967

 

1967번: 트리의 지름

파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n번째 줄까지 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연결하는 두 노드 중 부모 노드의 번호를 나타내고, 두 번째 정수는 자식 노드를, 세 번째 정수는 간선의 가중치를 나타낸다. 간선에 대한 정보는 부모 노드의 번호가 작은 것이 먼저 입력되고, 부모 노드의 번호가 같으면 자식 노드의 번호가 작은 것이 먼

www.acmicpc.net

트리를 이용한 bfs 문제였다. 트리의 단말 노드에서 다른 단말 노드로 이동하기까지 소요되는 비용이 가장 큰 루트를 찾아서 출력하면 된다.

 

트리의 노드간의 관계를 입력하는데 각각의 노드는 양방향으로 입력해준다. 노드의 갯수가 많아서 push_back()보다 효율적인 emplace_back()을 사용하였다.

 

n개의 노드를 탐색하는 도중에 자식이 없는 단말노드를 만나면 바로 위에 노드부터 bfs를 이용하여 탐색을 진행한다.

 

bfs는 각각의 자식 노드에 대하여 탐색을 진행하고 단말 노드를 만나면 총 사용한 비용을 조사했던 가장 큰 비용과 비교한 뒤에 큰 비용으로 교체한다.

#include <iostream>
#include <queue>
#include <vector>
#include <string.h>
#define MAX 10001
using namespace std;

int n; //노드의 갯수
int a, b, c; //출발지 a, 도착지 b, 비용 c
int big = -1; //지름 중에 가장 큰 비용
vector<pair<int,int>> v[MAX]; //a에서 b로 가는 비용은 c이다.
bool visit[MAX]; //노드 방문 여부

//지름을 찾는 과정은 bfs로 한다.
void bfs(int x, int y) {
	queue<pair<int, int>> q; //first까지 이동하는데 총 사용한 비용은 seconddlek.
	q.push(pair<int, int>(x, y)); //첫번째 노드의 위치와 비용을 삽입
	visit[x] = true; //방문처리

	while (!q.empty()) {
		//첫번째 원소 추출하고 삭제
		x = q.front().first;
		y = q.front().second;
		q.pop();

		if (v[x].size() == 1) { //자식이 하나도 없는 노드를 만나면
			big = max(big, y); //찾은 지름 중에 큰 지름 찾기
			continue; //다음 노드로 이동
		}

		for (int i = 0; i < v[x].size(); i++) { //x노드의 자식 노드를 탐색 
			if (!visit[v[x][i].first]) { //방문하지 않은 자식 노드이면
				q.push(pair<int, int>(v[x][i].first, y + v[x][i].second)); //큐에 삽입
				visit[v[x][i].first] = true; //방문처리
			}
		}
	}
}

int main() {
	cin >> n;
	for (int i = 0; i < n - 1; i++) {
		cin >> a >> b >> c;

		//항상 양방향으로 이동한다고 가정하고 큐에 삽입
		v[a].emplace_back(pair<int, int>(b, c));
		v[b].emplace_back(pair<int, int>(a, c));
	}

	for (int i = 1; i <= n; i++) {
		if (v[i].size() == 1) { //자식 노드가 없는 노드이면
			memset(visit, false, sizeof(bool) * (n + 1)); //모든 노드를 미방문처리
			visit[i] = true; //출발지를 방문처리
			bfs(v[i][0].first, v[i][0].second); //출발지 바로 아래 자식에서 bfs탐색 시작
		}
	}

	cout << big;
}

'백준' 카테고리의 다른 글

백준2234 - 성곽  (0) 2020.03.11
백준10819 - 차이를 최대로  (0) 2020.03.10
백준7569 - 토마토  (0) 2020.03.05
백준6593 - 상범 빌딩  (0) 2020.03.04
백준2665 - 미로만들기  (0) 2020.03.03