티스토리 뷰

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
댓글
«   2025/03   »
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