문제링크 : https://www.acmicpc.net/problem/14657
14657번: 준오는 최종인재야!!
첫째 줄에 문제의 수 N, 하루 풀이 시간 T가 주어진다. (2 ≤ N ≤ 50,000, 1 ≤ T ≤ 100,000) 이후 둘째 줄 부터 N-1개의 줄에 걸쳐 각 줄마다 A, B, C가 주어진다. (1 ≤ A, B ≤ N, 1 ≤ C ≤ 1,000) A와 B는
www.acmicpc.net
접근 과정 :
- 먼저 가장 많은 문제를 푸는 경우(트리의 지름)을 찾아야 한다.!!
- + 가장 많은 문제를 푸는 경우가 여러개 존재한다면, 가장 시간이 짧은 것을 찾아야 한다.!!
- 즉, 가장 긴 트리의 지름 중에서 가장 가중치가 적은 경우를 찾고
- 이를 기준으로 다시 한번 조회해서, 정확한 가중치를 찾아서 반환한다!!
소스 코드 및 결과 :
package BOJ;
/*
준오는 최종인재야!!
*/
import java.io.*;
import java.util.*;
public class BOJ14657 {
static int N, T;
static List<List<int[]>> links;
static boolean[] solved;
static int cnt, day, root;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
T = Integer.parseInt(st.nextToken());
links = new ArrayList<>();
links.add(new ArrayList<>());
for (int i = 1; i <= N; i++) {
links.add(new ArrayList<>());
}
for (int i = 1; i < N; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
links.get(a).add(new int[] { b, c });
links.get(b).add(new int[] { a, c });
}
cnt = 1;
root = 0;
day = 0;
solved = new boolean[N + 1];
dfs(1, 1, 0);
Arrays.fill(solved, false);
dfs(root, 1, 0);
day = day % T == 0 ? day / T : day / T + 1;
System.out.println(day);
}
static void dfs(int now, int c, int t) {
if (cnt < c) {
root = now;
cnt = c;
day = t;
}
else if (cnt == c && day > t) {
root = now;
day = t;
}
solved[now] = true;
for (int[] next : links.get(now)) {
if (!solved[next[0]]) {
dfs(next[0], c + 1, t + next[1]);
}
}
}
}
'Algorithm' 카테고리의 다른 글
[백준 Gold 1] 2098 외판원 순회 - Java (0) | 2021.12.22 |
---|---|
[백준 Silver 2] 10971 외판원 순회2 - Java (0) | 2021.12.22 |
[백준 Gold 3] 13701 중복 제거 - Java (0) | 2021.12.21 |
[백준 Silver 1] 2961 도영이가 만든 맛있는 음식 - Java (0) | 2021.12.21 |
[백준 Gold 2] 1525 퍼즐 - Java (0) | 2021.12.19 |