티스토리 뷰

1. 문제 링크

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

 

1967번: 트리의 지름

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

www.acmicpc.net

2. 문제 개요

 트리에서 어떤 두 노드를 선택해서 양쪽으로 쫙 당길 때, 가장 길게 늘어나는 경우가 있을 것이다. 이럴 때 트리의 모든 노드들은 이 두 노드를 지름의 끝 점으로 하는 원 안에 들어가게 된다. 트리의 지름을 구해서 출력하는 프로그램을 작성하시오.

 

3. 문제 힌트

루트에서 가장 먼 노드를 찾아가서 거기서 가장 먼 노드를 찾기.

 

4. 문제 풀이

우선 인접리스트를 만들어야 한다. 그리고 양방향 간선을 연결해주자.

 

root에서 가장 먼 노드를 BFS로 찾는다. 그리고 그 점을 시작으로 가장 먼 노드를 찾으면 그것이 트리의 지름이 된다.

 

5. 코드

#include <cstdio>
#include <queue>
#include <vector>
using namespace std;

//left, weight
vector<pair<int,int>>adj[10001];
queue<pair<int,int>> q;
bool visited[10001];

int main()
{
	int n;
	scanf("%d", &n);

	for (int i = 0; i < n-1; ++i){
		int cur, child, weight;

		scanf("%d %d %d", &cur, &child, &weight);

		adj[cur].push_back(make_pair(child, weight));
		adj[child].push_back(make_pair(cur, weight));
	}

	//루트로 부터 가장 먼 노드 찾기.
	fill(visited, visited + 10001, false);
	q.push({ 1,0 });
	visited[1] = true;
	int ansv = -1;
	int answ = -1;
	while (!q.empty())
	{
		int cv = q.front().first; 
		int cw = q.front().second;
		q.pop();

		if (answ < cw) {
			answ = cw;
			ansv = cv;
		}
		int len = adj[cv].size();

		for (int i = 0; i < len; ++i)
		{
			int nv = adj[cv][i].first;
			int nw = cw + adj[cv][i].second;

			if (!visited[nv])
			{
				visited[nv] = true;
				q.push({ nv,nw });
			}
		}
	}
	
	//루트로부터 가장 먼 노드로 부터 시작해서 가장 먼 노드 찾기
	//그냥 BFS한번 더

	fill(visited, visited + 10001, false);
	q.push({ ansv,0 });
	answ = 0;
	visited[ansv] = true;
	
	while (!q.empty())
	{
		int cv = q.front().first;
		int cw = q.front().second;
		q.pop();

		if (answ < cw) {
			answ = cw;
			ansv = cv;
		}
		int len = adj[cv].size();

		for (int i = 0; i < len; ++i)
		{
			int nv = adj[cv][i].first;
			int nw = cw + adj[cv][i].second;

			if (!visited[nv])
			{
				visited[nv] = true;
				q.push({ nv,nw });
			}
		}
	}




	printf("%d", answ);

	return 0;
}

6. 결과 사진

지적, 댓글 언제나 환영입니다~

 

'알고리즘 > Tree' 카테고리의 다른 글

백준, boj) 1991. 트리순회 ( C / C++)  (0) 2020.04.14
댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday