Algorithm/BFS & DFS

[๋ฐฑ์ค€, Java] 1967๋ฒˆ : ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„

Zayson 2022. 5. 8. 16:01

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

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

๐Ÿ˜ฎ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

Map์„ ์ด์šฉํ•ด ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

๋ฌธ์ œ์—์„œ ๋ฃจํŠธ๋…ธ๋“œ๊ฐ€ 1์ด๋ผ๊ณ  ์ฃผ์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ด์šฉํ•ด ๊ฐ€์žฅ ๋ฉ€๋ฆฌ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๋จผ์ € ํƒ์ƒ‰ํ•œ๋‹ค.

๊ฐ€์žฅ ๋จผ ๋…ธ๋“œ๋ฅผ ์ฐพ์•˜๋‹ค๋ฉด, ํ•ด๋‹น ๋…ธ๋“œ๋กœ ๋‹ค์‹œ ๊ฐ€์žฅ ๋จผ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด ๋…ธ๋“œ์™€ ๋…ธ๋“œ๊ฐ„ ๊ฐ€์žฅ ๋จผ ์ง€๋ฆ„์ด ํƒ์ƒ‰๋œ๋‹ค.

  1. ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ด์šฉํ•ด DFS ํƒ์ƒ‰ ๋ฐ ๊ฐ€์žฅ ๋จผ ๋…ธ๋“œ ์ฐพ๊ธฐ
  2. ํƒ์ƒ‰ํ•œ ๊ฐ€์žฅ ๋จผ ๋…ธ๋“œ๋ฅผ ์ด์šฉํ•ด ๋‹ค์‹œ ํ•œ๋ฒˆ DFS ํƒ์ƒ‰ ๋ฐ ์ง€๋ฆ„ ๊ฐฑ์‹ 

๐Ÿšฉ Java ์ฝ”๋“œ

package com.algorithm.Baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main_1967_ํŠธ๋ฆฌ์˜_์ง€๋ฆ„ {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        Map<Integer, List<Node>> tree = new HashMap<>();

        // ํŠธ๋ฆฌ ์ดˆ๊ธฐํ™”
        for (int node = 0; node <= N; node++) {
            tree.put(node, new ArrayList<>());
        }

        // ํŠธ๋ฆฌ ์—ฐ๊ฒฐ
        for (int edge = 0; edge < N - 1; edge++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int parent = Integer.parseInt(st.nextToken());
            int child = Integer.parseInt(st.nextToken());
            int weight = Integer.parseInt(st.nextToken());

            tree.get(parent).add(new Node(child, weight));
            tree.get(child).add(new Node(parent, weight));
        }

        int rst = getTreeLength(N, tree);
        System.out.println(rst);
        br.close();
    }

    private static int getTreeLength(int size, Map<Integer, List<Node>> tree) {
        startNode = maxStartLength = 0;
        boolean[] visited = new boolean[size + 1];

        // ๋ฃจํŠธ ๋…ธ๋“œ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๋จผ ๋…ธ๋“œ ์ฐพ๊ธฐ
        getMaxLength(1, visited, tree,  0);

        // ๊ฐ€์žฅ ๋จผ ๋…ธ๋“œ๋กœ ๋‹ค์‹œ DFS
        visited = new boolean[size + 1];
        maxStartLength = 0;     // ์ตœ์žฅ ์ง€๋ฆ„ ๊ธธ์ด ์ดˆ๊ธฐํ™”
        getMaxLength(startNode, visited, tree, 0);
        return maxStartLength;
    }

    private static int startNode, maxStartLength;
    private static void getMaxLength(int node, boolean[] visited, Map<Integer, List<Node>> tree, int weight) {
        visited[node] = true;
        for (Node next : tree.get(node)) {
            if (!visited[next.getNode()]) {
                if (next.getWeight() + weight > maxStartLength) {
                    startNode = next.getNode();
                    maxStartLength = next.getWeight() + weight;
                }
                getMaxLength(next.getNode(), visited, tree, weight + next.getWeight());
            }
        }
    }

    static class Node {
        private int node;
        private int weight;

        public Node(int node, int weight) {
            this.node = node;
            this.weight = weight;
        }

        public int getNode() {
            return node;
        }

        public int getWeight() {
            return weight;
        }
    }
}
๋ฐ˜์‘ํ˜•