[java]트리의 지름 - 백준1967

문제



풀이

문제 해석을 하자면,

  • 트리는 무방향이며, 제일 큰 너비를 구하는 문제이다.


풀이

  • 이전에 풀었던 “트리의 지름” 문제와 매우 유사하므로 해당 풀이 게시물도 참고
  • 여기서 루트 노드 1로 고정 해주지만, 사실 BOJ 1167을 풀었다면 루트 노드가 무엇이든 상관 없이 풀 수 있을것이다.
  • 무방향 그래프라고 언급했으므로 주의 => BOJ 1167 과 유일하게 달랐던 부분
  • 이곳에서도 핵심 풀이는 DFS를 처음 임의의 노드에서 1번, 이를 통해서 찾아낸 제일 거리먼 노드에서 1번 하는 것이다.



코드

/**
 * 루트 노드 1로 고정 해주지만, 사실 BOJ 1167을 풀었다면 루트 노드가 무엇이든 상관 없이 풀 수 있을것이다.
 * 무방향 그래프라고 언급했으므로 주의 => BOJ 1167 과 유일하게 달랐던 부분
 * 이곳에서도 핵심 풀이는 DFS를 처음 임의의 노드에서 1번, 이를 통해서 찾아낸 제일 거리먼 노드에서 1번 하는 것이다.
 */
static List<Node>[] inArr = new ArrayList[10005];
static boolean[] visited = new boolean[10005];
static int maxNode, maxVal;

static void dfs(int val, int node) {
    // base condition -> visited
    if(maxVal < val) {
        maxVal = val;
        maxNode = node;
    }
    // recursion
    for(Node nxt : inArr[node]) {
        if(visited[nxt.nxt]) continue;
        visited[nxt.nxt] = true;
        dfs(val+nxt.w, nxt.nxt);
        visited[nxt.nxt] = false; // backtracking
    }
}

public static void main(String[] args) throws IOException {
    // input
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer stk;
    int N = Integer.parseInt(br.readLine());
    for(int i = 0; i<N+5; i++) inArr[i] = new ArrayList<>();
    for(int i = 0 ; i<N-1 ; i++){
        stk = new StringTokenizer(br.readLine(), " ");
        int a = Integer.parseInt(stk.nextToken());
        int b = Integer.parseInt(stk.nextToken());
        int c = Integer.parseInt(stk.nextToken());
        inArr[a].add(new Node(b, c));
        inArr[b].add(new Node(a, c)); // 무방향
    }
    // run
    visited[1] = true;
    dfs(0, 1); // 임의의 노드 1
    visited[1] = false; // backtracking

    visited[maxNode] = true;
    dfs(0, maxNode); // 임의의 노드 maxNode
    visited[maxNode] = false; // backtracking
    // output
    System.out.println(maxVal);
}
static class Node {
    int nxt, w;
    public Node (int nxt, int w) {
        this.nxt = nxt; this.w = w;
    }
}



느낀점

생략

댓글남기기