[백준] 1967번: 트리의 지름(C++)

2025. 5. 16. 18:52·개발/알고리즘

문제 링크

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

 

 

코드 구현

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

vector<vector<pair<int, int>>> tree;
vector<bool> visited;
int maxDist = 0, farNode = 0;

void dfs(int node, int dist)
{
	visited[node] = true;

	if (dist >= maxDist)
	{
		maxDist = dist;
		farNode = node;
	}

	for (const pair<int, int> pair : tree[node])
	{
		int neighbor = pair.first;
		int weight = pair.second;

		if (!visited[neighbor])
		{
			dfs(neighbor, dist + weight);
		}
	}
}

int main()
{
	int n;
	cin >> n;

	tree.resize(n + 1);
	visited.resize(n + 1);

	for (int i = 0; i < n - 1; i++)
	{
		int p, c, w;
		cin >> p >> c >> w;
		tree[p].push_back(make_pair(c, w));
		tree[c].push_back(make_pair(p, w));
	}

	// dfs로 가장 먼 노드 구하기
	dfs(1, 0);

	// 이 노드에서 가장 먼 노드의 거리 구하기
	// visited, maxDist 초기화
	fill(visited.begin(), visited.end(), false);
	maxDist = 0;
	dfs(farNode, 0);

	cout << maxDist << endl;

	return 0;
}

 

 

해결 방법

  • 임의의 노드에서 가장 먼 노드 찾기
  • 그 노드에서 다시 가장 먼 노드 찾기
  • 두 노드 사이의 거리가 트리의 지름

위 방법을 참고하여 dfs를 이용해 시작 노드(1번)에서 가장 먼 노드를 찾고, 그 노드에서 다시 dfs를 돌아 가장 먼 노드를 찾았다.

처음에는 가중치를 따로 저장하는 벡터를 만들어서 시도해 봤는데 그렇게 되면 부모->자식으로 내려갈 때는 문제가 없지만, dfs의 시작 노드가 루트 노드가 아닌 특정 노드로 시작하게 된다면 자식 -> 부모로 접근할 때 부모에 있는 가중치가 합해지는 문제가 생겨 pair<int, int>를 사용해 tree를 노드 정보를 구현하였다.

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

[프로그래머스] 단어 변환(C++)  (1) 2025.05.26
[백준] 7576번: 토마토(C++)  (1) 2025.05.24
[프로그래머스] 가장 먼 노드(C++)  (1) 2025.05.15
[프로그래머스] 길 찾기 게임(C++)  (2) 2025.05.13
[백준] 회의실 배정(C++)  (1) 2025.05.12
'개발/알고리즘' 카테고리의 다른 글
  • [프로그래머스] 단어 변환(C++)
  • [백준] 7576번: 토마토(C++)
  • [프로그래머스] 가장 먼 노드(C++)
  • [프로그래머스] 길 찾기 게임(C++)
Majangnan
Majangnan
  • Majangnan
    개발 모코코
    Majangnan
  • 전체
    오늘
    어제
    • 분류 전체보기 (66) N
      • 개발 (65) N
        • C# (10)
        • SQL (3)
        • Unity (8)
        • Unreal (10)
        • C++ (3)
        • Server (1)
        • DX11 (8)
        • 알고리즘 (21) N
  • 블로그 메뉴

    • 홈
    • 방명록
    • 깃허브
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    MAC
    DX11
    blueprint
    3dlight
    C#
    블루프린트
    Mecanim
    상속
    dx3d
    DirectX11
    코딩테스트
    Unity
    UnReal
    sql
    슈팅게임
    알고리즘
    c++
    언리얼
    프로그래머스
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Majangnan
[백준] 1967번: 트리의 지름(C++)
상단으로

티스토리툴바