์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

[ ๋ฐฑ์ค€ / BOJ 1967 ] ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„ ( ์ž๋ฐ” / JAVA )

KIMHYEYUN 2021. 10. 20. 23:24
๋ฐ˜์‘ํ˜•

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

 

1967๋ฒˆ: ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„

ํŒŒ์ผ์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์€ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ n(1 ≤ n ≤ 10,000)์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ n-1๊ฐœ์˜ ์ค„์— ๊ฐ ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด์˜จ๋‹ค. ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ์„ธ ๊ฐœ์˜ ์ •์ˆ˜๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ •์ˆ˜๋Š” ๊ฐ„์„ ์ด ์—ฐ

www.acmicpc.net

 

๋ฌธ์ œ


ํŠธ๋ฆฌ(tree)๋Š” ์‚ฌ์ดํด์ด ์—†๋Š” ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์ด๋‹ค. ํŠธ๋ฆฌ์—์„œ๋Š” ์–ด๋–ค ๋‘ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด๋„ ๋‘˜ ์‚ฌ์ด์— ๊ฒฝ๋กœ๊ฐ€ ํ•ญ์ƒ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค. ํŠธ๋ฆฌ์—์„œ ์–ด๋–ค ๋‘ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด์„œ ์–‘์ชฝ์œผ๋กœ ์ซ™ ๋‹น๊ธธ ๋•Œ, ๊ฐ€์žฅ ๊ธธ๊ฒŒ ๋Š˜์–ด๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด๋Ÿด ๋•Œ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์€ ์ด ๋‘ ๋…ธ๋“œ๋ฅผ ์ง€๋ฆ„์˜ ๋ ์ ์œผ๋กœ ํ•˜๋Š” ์› ์•ˆ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

์ด๋Ÿฐ ๋‘ ๋…ธ๋“œ ์‚ฌ์ด์˜ ๊ฒฝ๋กœ์˜ ๊ธธ์ด๋ฅผ ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ •ํ™•ํžˆ ์ •์˜ํ•˜์ž๋ฉด ํŠธ๋ฆฌ์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ๋“ค ์ค‘์—์„œ ๊ฐ€์žฅ ๊ธด ๊ฒƒ์˜ ๊ธธ์ด๋ฅผ ๋งํ•œ๋‹ค.

์ž…๋ ฅ์œผ๋กœ ๋ฃจํŠธ๊ฐ€ ์žˆ๋Š” ํŠธ๋ฆฌ๋ฅผ ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋Š” ๊ฐ„์„ ๋“ค๋กœ ์ค„ ๋•Œ, ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์„ ๊ตฌํ•ด์„œ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์•„๋ž˜์™€ ๊ฐ™์€ ํŠธ๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค๋ฉด ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์€ 45๊ฐ€ ๋œ๋‹ค.

ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ๋Š” 1๋ถ€ํ„ฐ n๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋‹ค.

์ž…๋ ฅ


ํŒŒ์ผ์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์€ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ n(\(1 \leq n \leq 10,000\))์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ n-1๊ฐœ์˜ ์ค„์— ๊ฐ ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด์˜จ๋‹ค. ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ์„ธ ๊ฐœ์˜ ์ •์ˆ˜๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ •์ˆ˜๋Š” ๊ฐ„์„ ์ด ์—ฐ๊ฒฐํ•˜๋Š” ๋‘ ๋…ธ๋“œ ์ค‘ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , ๋‘ ๋ฒˆ์งธ ์ •์ˆ˜๋Š” ์ž์‹ ๋…ธ๋“œ๋ฅผ, ์„ธ ๋ฒˆ์งธ ์ •์ˆ˜๋Š” ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๊ฒƒ์ด ๋จผ์ € ์ž…๋ ฅ๋˜๊ณ , ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ™์œผ๋ฉด ์ž์‹ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๊ฒƒ์ด ๋จผ์ € ์ž…๋ ฅ๋œ๋‹ค. ๋ฃจํŠธ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๋Š” ํ•ญ์ƒ 1์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉฐ, ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๋Š” 100๋ณด๋‹ค ํฌ์ง€ ์•Š์€ ์–‘์˜ ์ •์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ


์ฒซ์งธ ์ค„์— ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์„ ์ถœ๋ ฅํ•œ๋‹ค.

ํ’€์ด


DFS ๋ฅผ ์ด์šฉํ•ด์„œ ํ’€๋ฉด ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ โ€ผ๏ธ

 

1๏ธโƒฃ ๋ฃจํŠธ์ธ 1๋ฒˆ์—์„œ ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜์˜ ํ•ฉ์ด ๊ฐ€์žฅ ํฐ ๋…ธ๋“œ๋ฅผ ์ €์žฅ farthestNode

2๏ธโƒฃ farthestNode ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๊ฐ€์ค‘์น˜์˜ ํ•ฉ์ด ํฐ ๊ฒฝ๋กœ ์ฐพ๊ธฐ ๐Ÿ‘‰ ๊ฐ€์ค‘์น˜์˜ ํ•ฉ ์ถœ๋ ฅ

์ฝ”๋“œ


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main_BOJ_1967_ํŠธ๋ฆฌ์˜์ง€๋ฆ„ {

    static class node{
        int num;
        int weight;

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

    static int n, dist, farthestNode;
    static ArrayList<node> adj[];
    static boolean[] isVisited;

    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stringTokenizer;

        n = Integer.parseInt(br.readLine());
        dist = 0;
        farthestNode = 0;
        adj = new ArrayList[n+1];
        isVisited = new boolean[n+1];

        for(int i = 0 ; i < n+1; i++){
            adj[i] = new ArrayList<>();
        }

        for(int i = 0 ; i < n-1; i++){
            stringTokenizer = new StringTokenizer(br.readLine());
            int p = Integer.parseInt(stringTokenizer.nextToken());
            int c = Integer.parseInt(stringTokenizer.nextToken());
            int w = Integer.parseInt(stringTokenizer.nextToken());

            adj[p].add(new node(c, w));
            adj[c].add(new node(p, w));
        }

        isVisited[1] = true;
        DFS(1, 0);

        isVisited = new boolean[n+1];
        dist = 0;
        isVisited[farthestNode] = true;
        DFS(farthestNode, 0);

        System.out.println(dist);

    }

    private static void DFS(int nodeNum, int distSum) {

        if(dist < distSum){
            dist = distSum;
            farthestNode = nodeNum;
        }
        
        for(node next : adj[nodeNum]){
            if(isVisited[next.num]) continue;

            isVisited[next.num] = true;
            DFS(next.num, distSum + next.weight);
        }
    }
}

 

728x90
๋ฐ˜์‘ํ˜•