[BOJ알고리즘, C++]#1967_트리의 지름, 무 방향 비 순환 그래프

2023. 7. 28. 22:05· 문제 풀이/BOJ 문제 풀이
목차
  1.  
  2. [BOJ알고리즘, C++]#1967_트리의 지름

 

[BOJ알고리즘, C++]#1967_트리의 지름

 

BOJ 알고리즘 문제 풀이, 1967번 문제 트리의 지름

무 방향 비순환 그래프의 지름(무 방향성 간선을 갖는 트리)을 구하는 방법에 대해 알아보겠습니다.

 


 

Overview

 

  1. 문제
  2. 풀이
  3. 코드

 

#0. 문제

1. BOJ_1967번 문제

 

#1. 풀이

1. 트리 자료구조

 

[자료구조]#5_트리

[자료구조]#5_트리 트리 자료구조에 대해 알아보겠습니다. Overview 개념 이진트리 순회 이진 탐색 트리 균형 이진트리 AVL 트리 레드-블랙 트리 Map, Set 힙 #0. 개념 1. 트리? 트리는 1:n 관계의 계층 구

webddevys.tistory.com

 

  • 트리 자료구조는 1:N 관계를 갖는 비 선형 연결 자료구조입니다.
  • 트리는 노드 간 계층 구조를 가지며, 노드 간 연결 관계를 간선으로 표현합니다.

 

2. 그래프 자료구조

 

[자료구조]#6_그래프

ㅌ[자료구조]#6_그래프 그래프 자료구조에 대해 알아보겠습니다. Overview 개념 구현 탐색 정렬 신장 트리(Spanning Tree) 최소 신장 트리(Minimum Spanning Tree) #0. 개념 1. 그래프? 그래프는 노드와 간선들의

webddevys.tistory.com

 

  • 그래프 자료구조는 노드와 간선들의 집합으로 이루어진 비 선형 연결 자료구조입니다.
  • 그래프는 노드 간 연결 관계를 간선으로 표현하며, 일종의 네트워크를 형성합니다. 그래프는 노드의 개수, 간선의 방향성 유무에 따라서 다양한 형태로 나타납니다.
  • 문제는 "트리의 지름"이라고 표현했지만, 예제 입력 중 1번 노드 -> 3번 노드를 연결하는 간선을 3번 노드 -> 1번 노드를 연결하는 간선이라고 표현한 것을 보면 무방향 간선을 갖는 트리이며, 동시에 무방향 비순환 가중치 그래프로도 볼 수 있겠습니다. 정리하면, 트리의 간선에 가중치를 부여한다면, 해당 트리는 무 방향 비 순환 가중치 그래프의 특별한 형태로 볼 수 있습니다.

 

 

3. 트리의 지름

  • 트리의 지름을 찾는 방법은 두 번의 DFS(깊이 우선 탐색)입니다.
  • 트리의 지름을 찾는 과정의 첫 번째 단계는 DFS(깊이 우선 탐색)을 통해 임의의 시작 정점으로부터 가장 먼 정점을 찾습니다. 이때, 가장 멀 다는 것은 두 정점 사이의 간선들이 갖는 가중치의 합이 최대가 된다는 것을 의미합니다.
  • 트리의 지름을 찾는 과정의 두 번째 단계는 DFS(깊이 우선 탐색)을 통해 위에서 얻은 가장 먼 정점을 시작 노드로 설정해 다시 해당 노드로부터 가장 먼 정점을 찾습니다.
  • 첫 번째 단계에서 찾은 가장 먼 정점으로부터 두 번째 단계에서 찾은 가장 먼 정점 사이에 존재하는 간선들의 가중치 총합이 트리의 지름이 됩니다.

 

#2. 코드

1. BOJ_1967번 문제 제출 코드

#include <iostream>
#include <vector>
using namespace std;

#define MAX_SIZE 10001

struct Edge
{
    int to, weight;
    Edge(int _to, int _weight) : to(_to), weight(_weight) {}
};

vector<vector<Edge>> Tree(MAX_SIZE);
vector<bool> visited(MAX_SIZE, false);
int MaxDist, FarthestNode;

void DFS(int cur, int dist, vector<bool>& visited)
{
    visited[cur] = true;

    if(dist > MaxDist)
    {
        MaxDist = dist;
        FarthestNode = cur;
    }

    for(auto& edge : Tree[cur])
    {
        int to = edge.to;
        int weight = edge.weight;
        if(!visited[to])
        {
            DFS(to, dist+weight, visited);
        }
    }
}


int main()
{
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);

    int n;

    cin >> n;

    for(int i=0; i<n-1; i++)
    {
        int parent, child, weight;
        cin >> parent >> child >> weight;
        Tree[parent].push_back(Edge(child, weight));
        Tree[child].push_back(Edge(parent, weight));
    }

    DFS(1, 0, visited);

    MaxDist = 0;
    visited.clear();
    visited.resize(MAX_SIZE, false);
    DFS(FarthestNode, 0, visited);

    cout << MaxDist;

    return 0;
}

'문제 풀이 > BOJ 문제 풀이' 카테고리의 다른 글

[BOJ알고리즘, C++]#28279_덱2, deque  (0) 2023.09.24
[BOJ알고리즘, C++]#28278_스택2, stack 컨테이너  (0) 2023.09.24
[BOJ알고리즘, C++]#1167_트리의 지름, 유 방향 비 순환 가중치 그래프  (0) 2023.07.28
[BOJ알고리즘, C++]#1991_트리 순회, 전위 순회, 중위 순회, 후위 순회  (0) 2023.07.28
[BOJ알고리즘, C++]#11725_트리의 부모 찾기, 트리 탐색  (0) 2023.07.28
  1.  
  2. [BOJ알고리즘, C++]#1967_트리의 지름
'문제 풀이/BOJ 문제 풀이' 카테고리의 다른 글
  • [BOJ알고리즘, C++]#28279_덱2, deque
  • [BOJ알고리즘, C++]#28278_스택2, stack 컨테이너
  • [BOJ알고리즘, C++]#1167_트리의 지름, 유 방향 비 순환 가중치 그래프
  • [BOJ알고리즘, C++]#1991_트리 순회, 전위 순회, 중위 순회, 후위 순회
Hardii2
Hardii2
Hardii2
개발 블로그
Hardii2
전체
오늘
어제
  • 분류 전체보기
    • 알고리즘
    • 웹 개발
      • Node.js
      • React
    • 게임개발
      • DirectX12
      • 관련 지식
      • Unreal C++
      • Unreal 블루프린트
    • 언어
      • Effective C++
      • Basic C++
      • 디자인 패턴
      • 자료구조
      • 기술 질문
    • 문제 풀이
      • BOJ 문제 풀이
      • Programmers 문제 풀이
      • geeksForgeeks 문제 풀이
    • 수학
      • 확률과 통계
      • 게임수학
    • 개인프로젝트
    • 그룹프로젝트
      • PM
      • Dev
    • Github

블로그 메뉴

  • 홈
  • 글쓰기

공지사항

인기 글

태그

  • dfs
  • 정렬
  • 최단 경로
  • BFS
  • stl
  • 알고리즘
  • programmers
  • 기술 질문
  • BOJ
  • Unreal Blueprint
  • Effective C++
  • DP
  • 디자인 패턴
  • 그래프
  • set
  • 우선순위 큐
  • 트리
  • C++
  • unreal
  • 개발

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
Hardii2
[BOJ알고리즘, C++]#1967_트리의 지름, 무 방향 비 순환 그래프
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.