https://www.acmicpc.net/problem/1967
1967번: 트리의 지름
파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연
www.acmicpc.net
참고한 문제풀이 블로그 https://ilmiodiario.tistory.com/148
핵심
1 ~ N까지 노드와 연결된 간선정보를 양방향 인접리스트로 표현
→ List<Node> list[]
간선에 가중치가 있어 Node 클래스를 만들어 입력 받음
모든 노드에 대해 각 노드마다 DFS 를 통해 연결된 노드 끝까지 가보며 가중치를 더한다.
그리고 더한 가중치값 중 가장 큰 값이 결과값이 된다.
키워드
1️⃣ List<Node> list[]
2️⃣ 무방향그래프 == 양방향 추가 (부모 ↔️ 자식)
3️⃣ DFS를 통해 탐색하며 가중치 더하기 (1 ~ N 번 노드까지)
포인트
// 부모노드, 자식노드, 간선가중치는 List<Node>[] 에 저장한다.
// (List<Node>타입의 원소를 가지는 배열에 저장)
// 무방향 그래프이므로 (부모 - 자식) 양방향으로 저장한다.
// 트리의 지름은 dfs를 이용해 루트노드부터 시작해서 모든노드에서 가장 먼노드까지의 가중치를 계산한다.
// 가중치 중 가장 큰 값을 결과값 변수에 계속 업데이트 해준 뒤 반환한다.
import java.util.*;
import java.io.*;
public class Main {
static class Node {
int data, weight;
Node(int data, int weight) {
this.data = data;
this.weight = weight;
}
}
static List<Node> gragh[];
static boolean visited[];
static int max = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
gragh = new ArrayList[n + 1];
StringTokenizer st;
//초기화
for(int i = 0; i <= n; i++)
gragh[i] = new ArrayList<Node>();
//그래프 연결하기
for(int i = 1; i < n; i++) {
st = new StringTokenizer(br.readLine());
int par = Integer.parseInt(st.nextToken());
int chi = Integer.parseInt(st.nextToken());
int wei = Integer.parseInt(st.nextToken());
gragh[par].add(new Node(chi, wei));
gragh[chi].add(new Node(par, wei));
}
//dfs로 모든 각각의 노드들에서 가장먼 노드까지의 가중치계산
for(int i = 1; i <= n; i++) {
visited = new boolean[n + 1];
visited[i] = true;
dfs(i,0);
}
System.out.println(max);
}
static void dfs(int cur, int dis) {
for(Node node : gragh[cur]) {
if(!visited[node.data]) {
visited[node.data] = true;
dfs(node.data, dis + node.weight);
}
}
max = max < dis ? dis : max;
}
}
기억하자 메소-드
✅ offerFirst(), offerLast() : 큐의 처음, 큐의 마지막에 원소 추가
✅ pollFirst(), pollLast() : 큐의 처음, 큐의 마지막 요소를 제거
✅ Map.getOrDefault(Object key, V defaultValue)
key | 찾을 키 값 |
defaultValue | 키가 맵에 없을 경우 반환할 기본값 |
(예시) map.getOrDefault(c,0) + v | 키 c가 맵에 없을경우 값을 0으로 설정하고 그게 아니라면 v를 더함 |
'알고리즘' 카테고리의 다른 글
[Java] 백준 2263번 트리의 순회 (0) | 2023.10.12 |
---|---|
[Java] 백준 1167번 트리의 지름 (0) | 2023.10.11 |
[Java] 백준 11725번 트리의 부모 찾기 (0) | 2023.10.11 |
[Java] 백준 1991번 트리 순회 (1) | 2023.10.07 |
[Java] 백준 2346번 풍선 터뜨리기 (0) | 2023.09.21 |