담배팔이소년
[BOJ] 01167 트리의 지름 본문
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