TaBo
개척하는 기록
TaBo
전체 방문자
오늘
어제
  • 기록들 (63)
    • Programming (35)
      • Java (19)
      • Servlet&Jsp (4)
      • Spring (4)
      • SpringBoot (1)
      • 기타 (2)
      • BOJ (5)
    • CS (16)
      • 자료구조 (4)
      • 알고리즘 (4)
      • 운영체제 (5)
      • 기본 용어 (3)
    • Project (4)
      • [Spring] 게시판 (4)
    • 나에 대한 기록 (8)

블로그 메뉴

  • Github

인기 글

태그

  • 스프링 게시판
  • Spring 게시판
  • 알고리즘
  • 자바
  • java
  • spring
  • OS
  • 운영체제
  • c++
  • 백준

최근 글

티스토리

hELLO · Designed By 정상우.
TaBo

개척하는 기록

Programming/BOJ

[Java] 백준 1967번 - 트리의 지름

2023. 4. 14. 10:27

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

 

1967번: 트리의 지름

파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연

www.acmicpc.net

 

[ 1 ] 풀이 및 소스코드

- 트리의 지름은 모든 노드에 대해 DFS를 하여 트리에 존재하는 모든 경로 중 가장 긴 것(가중치가 큰 경로)을 찾음으로써 구할 수 있다.

- 각 노드마다 DFS를 통해 연결된 노드들의 가중치를 더해가며 distance를 구하고, max를 업데이트 해 준다.

- 모든 노드에 대해 DFS를 실행한 후의 max 값이 트리의 지름이 된다.

- 각 노드와 간선 정보는 양방향 인접리스트에 저장했다.

- 간선에 가중치가 있기 때문에 Node 라는 클래스를 선언하여 인접리스트에 노드 정보와 간선의 가중치를 저장했다.

 

import java.util.*;
import java.io.*;

class Node {

    int n;
    int w;

    Node(int n, int w) {
        this.n = n;
        this.w = w;
    }

}

public class BOJ_1967 {

    static ArrayList<Node>[] list;
    static boolean[] visited;
    static int max = 0;

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        list = new ArrayList[n+1];
        for(int i = 1; i < n+1; i++) {
            list[i] = new ArrayList<Node>();
        }
        visited = new boolean[n+1];

        for(int i = 0; i < n-1; i++) {
            st = new StringTokenizer(br.readLine());
            int s = Integer.parseInt(st.nextToken());
            int e = Integer.parseInt(st.nextToken());
            int w = Integer.parseInt(st.nextToken());

            list[s].add(new Node(e, w));
            list[e].add(new Node(s, w));
        }

        for(int i = 1; i < n+1; i++) {
            dfs(i, 0);
            visited = new boolean[n+1];
        }

        System.out.println(max);

    }

    static void dfs(int s, int distance) {
        if(visited[s]) {
            return;
        }
        visited[s] = true;
        for(Node n : list[s]) {
            if(!visited[n.n]) {
                if(max < distance + n.w) {
                    max = distance + n.w;
                }
                dfs(n.n, distance + n.w);
            }
        }
    }

}

 

 

[ 2 ] 주의점

- dfs 메서드 내부에서 매개변수인 distance를 초기화하면 안 된다. 정상적인 재귀를 위해 distance + n.w 를 매개변수로 넘겨주자.

- 노드가 1개인 경우도 있기 때문에 max를 0으로 초기화해야 한다. 

저작자표시 비영리 변경금지 (새창열림)

'Programming > BOJ' 카테고리의 다른 글

[C/C++] 백준 7576번  (1) 2022.07.16
[C/C++] 백준 2263번  (0) 2022.07.07
[C/C++] 백준 1655번  (0) 2022.06.30
[C/C++] 백준 5430번  (1) 2022.06.26
    'Programming/BOJ' 카테고리의 다른 글
    • [C/C++] 백준 7576번
    • [C/C++] 백준 2263번
    • [C/C++] 백준 1655번
    • [C/C++] 백준 5430번
    TaBo
    TaBo

    티스토리툴바