0. 1967번 문제와 거의 동일한 풀이 (링크)
1. 트리의 모든 노드를 거치며 최댓값을 찾으므로, 시작점의 위치는 아무거나 선택해도 상관 없다
2. 부모-자식 관계를 확인하기 힘드므로 boolean배열을 유지해 방문 노드의 재방문을 막는다
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args)throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = pint(br.readLine());
isV=new boolean[N+1];
graph=new ArrayList<>();
max=0;
for (int i = 0; i <= N; i++) {
graph.add(new ArrayList<>());
}
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int V = pint(st.nextToken());
int node=0;
while( (node=pint(st.nextToken()))!=-1 ) {
int cost = pint(st.nextToken());
graph.get(V).add(new int[] {node,cost});
}
}
rec(1);
System.out.println(max);
}
static int N, max;
static boolean[]isV;
static ArrayList<ArrayList<int[]>>graph;
static int rec(int node) {
isV[node]=true;
int fst=0,snd=0;
for (int i = 0; i < graph.get(node).size(); i++) {
int[] next = graph.get(node).get(i);
//미방문이면
int temp=0;
if(!isV[ next[0] ]) {
temp = next[1] + rec( next[0] );
}
if(fst<temp) {
snd=fst;
fst=temp;
}else if(snd<temp) {
snd=temp;
}
}
max = Math.max(max, fst+snd);
return fst;
}
static int pint(String s) {
return Integer.parseInt(s);
}
}
'알고리즘 문제 풀이 > BOJ 골드' 카테고리의 다른 글
[백준] 2458 - 키 순서 (0) | 2021.04.21 |
---|---|
[백준] 15683 - 감시 (0) | 2021.04.21 |
[백준] 1081 - 합 (0) | 2021.04.20 |
[백준] 1238 - 파티 (0) | 2021.04.18 |
[백준] 1967 - 트리의 지름 (0) | 2021.04.18 |
[백준] 2263 - 트리의 순회 (0) | 2021.04.16 |
[백준] 17471 - 게리맨더링 (0) | 2021.04.16 |