지우너

[BOJ] 1167 JAVA 본문

Problem Solving

[BOJ] 1167 JAVA

지옹 2024. 12. 17. 15:17

문제

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

 

풀이

DFS1: 아무 정점에서 시작해서 가장 먼 노드a를 찾기

DFS2: 가장 먼노드a에서 가장 먼 노드 b를 찾기

a에서 b까지의 길이가 트리의 지름(트리에서 임의의 두 점 사이의 거리 중 가장 긴 것)

 

코드

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

public class Main {

    public static List<List<EdgeInfo>> edges;
    public static int[] dist;
    public static boolean[] visited;

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

        // [input] 트리가 입력으로 주어진다.
        // 첫 번째 줄에서는 트리의 정점의 개수 V
        int v = Integer.parseInt(br.readLine());

        // init
        edges = new ArrayList<>(v+1);
        for (int i = 0; i <= v; i++) {
            edges.add(new ArrayList<>());
        }
        // 둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지 매겨져 있다.
        // 정점 번호 연결된 간선의 정보(정점번호 그 정점까지의 거리) 주어지는 거리는 모두 10,000 이하의 자연수이다.
            // 예를 들어 네 번째 줄 "3 1 2 4 3 -1" 의 경우
            // 정점 3은 정점 1과 거리가 2인 간선으로 연결되어 있고,
            // 정점 4와는 거리가 3인 간선으로 연결되어 있는 것
            // 각 줄의 마지막에는 -1이 입력으로 주어진다.
        for (int i = 0; i < v; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            while(true){
                int b = Integer.parseInt(st.nextToken());
                if(b == -1){
                    break;
                }
                int w = Integer.parseInt(st.nextToken());
                EdgeInfo edgeInfo = new EdgeInfo(b, w);
                edges.get(a).add(edgeInfo);
            }
        }
        br.close();

        // [solution]
        int farNode = findFarNode(1, v).node;
        int farDist = findFarNode(farNode, v).weight;

        // [output]
        System.out.println(farDist);
    }

    /**
     * @param start 시작 노드
     * @param v 노드의 총 갯수
     * @return {가장 먼 노드, dist}
     */
    public static EdgeInfo findFarNode(int start, int v){
        dist = new int[v+1];
        visited = new boolean[v+1];

        // start에서 시작, 시작 weight=0
        DFS(start, 0);

        int farNode =-1;
        int farDist = -1;
        for (int i = 1; i <= v; i++) {
            if(dist[i]>farDist){
                farNode = i;
                farDist = dist[i];
            }
        }
        return new EdgeInfo(farNode, farDist);
    }

    public static void DFS(int curr, int total){
        visited[curr] =true;
        // curr에 연결된 간선 확인
        for (EdgeInfo edgeInfo : edges.get(curr)) {
            int next = edgeInfo.node;
            int nDist = edgeInfo.weight;
            if(!visited[next]){
                dist[next]=total+ nDist;
                DFS(next, dist[next]);
            }
        }
    }

    public static class EdgeInfo{
        int node;
        int weight;

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

}

'Problem Solving' 카테고리의 다른 글

[BOJ] 4963 JAVA  (0) 2024.12.17
[BOJ] 1260 C++  (0) 2024.12.16
[BOJ] 2667 JAVA  (0) 2024.12.16
[BOJ] 11652 JAVA  (0) 2024.12.10
[BOJ] 11650 JAVA  (0) 2024.12.09