담배팔이소년

[BOJ] 01167 트리의 지름 본문

Algorithm

[BOJ] 01167 트리의 지름

bkkmw 2023. 10. 18. 16:28

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

 

1167번: 트리의 지름

트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지

www.acmicpc.net

 

문제 풀이

package boj;

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

public class MainB_01167 {

	public static void main(String[] args) throws Exception {
		System.setIn(new FileInputStream("input/boj/input_01167.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		int N = Integer.parseInt(br.readLine());
		
		List<int[]>[] edges = new ArrayList[N];
		
		for(int i=0; i<N; i++) {
			st = new StringTokenizer(br.readLine());
			int cur = Integer.parseInt(st.nextToken())-1;
			edges[cur] = new ArrayList<int[]>();
			while(true) {
				int node = Integer.parseInt(st.nextToken());
				if(node == -1) break;
				int w = Integer.parseInt(st.nextToken());
				
				edges[cur].add(new int[] {node-1, w});
			}
		}
		
		int ans = solve(edges);
		System.out.println(ans);
		br.close();
	}
	
	public static int solve(List<int[]>[] edges) {
		int N = edges.length;
		
		boolean[] visited = new boolean[N];
		visited[0] = true;
		int[] res = find_max(edges, visited, 0, 0);
		
		visited = new boolean[N];
		visited[res[0]] = true;
		return find_max(edges, visited, res[0], 0)[1];
	}
	
	public static int[] find_max(List<int[]>[] edges, boolean[] visited, int node, int dist) {
		int len = edges[node].size();
		int[] ret = new int[2];
		for(int i=0; i<len; i++) {
			int[] next = edges[node].get(i);
			if(visited[next[0]]) continue;
			
			visited[next[0]] = true;
			int[] temp = find_max(edges, visited, next[0], dist+next[1]);
			
			if(temp[1] > ret[1]) {
				ret[0] = temp[0];
				ret[1] = temp[1];
			}
		}
		
		if(ret[1] == 0) {
			ret[0] = node;
			ret[1] = dist;
		}
		return ret;
	}
}

TLE(47%) : LinkedList가 아닌 ArrayList를 사용하여 해결했다

WA(4%) : 문제를 보면 "먼저 정점 번호가 주어지고, 이어서 ...". N번째 줄이 N-1번 node의 정보가 아니다.

'Algorithm' 카테고리의 다른 글

[BOJ] 01520 내리막 길  (0) 2023.09.06
[BOJ] 02116 주사위 쌓기  (0) 2023.09.06
[SWEA] 3238 이항계수 구하기  (0) 2023.07.31
[BOJ] 06198 옥상 정원 꾸미기  (0) 2023.07.19
[BOJ] 13459 구슬 탈출  (1) 2023.07.12
Comments