11725번 트리의 지름 문제에서 입력방식만 달라진 문제였다.
import java.io.*;
import java.util.*;
public class Main {
static class Node{
int idx;
int cnt;
Node(int idx, int cnt){
this.idx = idx;
this.cnt = cnt;
}
}
// 정점의 개수
static int v;
// 최대인 거리
static int max = 0;
// 루트노드에서 가장 멀리 떨어진 정점
static int max_idx = 0;
// 정점을 방문했는지 검사하는 배열
static boolean[] visit;
// 트리를 저장할 노드들의 어레이리스트 배열을 생성
static ArrayList<Node>[] list;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 정점의 개수를 입력받음
v = Integer.parseInt(br.readLine());
// 정점의 개수+1 크기의 어레이리스트 배열 생성
list = new ArrayList[v+1];
// v+1크기의 배열에 어레이리스트 공간을 할당
for(int i=0;i<=v;i++) {
list[i] = new ArrayList<>();
}
for(int i=0;i<v;i++) {
StringTokenizer st = new StringTokenizer(br.readLine()," ");
// 정점번호
int n = Integer.parseInt(st.nextToken());
int tmp;
// 양방향리스트를 생성
while((tmp=Integer.parseInt(st.nextToken()))!=-1) {
int weight=Integer.parseInt(st.nextToken());
list[n].add(new Node(tmp, weight));
list[tmp].add(new Node(n, weight));
}
}
// 루트에서 가장 먼 정점을 찾기 위한 과정
// 루트노드인 1을 방문했다고 표시 후 dfs함
visit = new boolean[v+1];
visit[1] = true;
dfs(1,0);
// 방문배열 초기화
// 루트에서 가장 먼 정점에서 다시 bfs를 해 최대 거리를 구함
visit = new boolean[v+1];
visit[max_idx] = true;
dfs(max_idx, 0);
System.out.println(max);
}
static void dfs(int idx, int cnt) {
// 새로 구한 거리 == cnt가 기존 최대거리보다 더 크다면 갱신
if(max<cnt) {
max = cnt;
max_idx = idx;
}
// idx 노드의 인접 정점들에 대해 dfs를 수행함
// 수행할 때마다 거리는 업데이트해줌
for(Node node : list[idx]) {
if(!visit[node.idx]) {
visit[node.idx] = true;
dfs(node.idx, cnt+node.cnt);
}
}
}
}
'Algorithm > [BOJ] - JAVA' 카테고리의 다른 글
[백준] 1707 : 이분 그래프 JAVA 풀이 (0) | 2022.10.28 |
---|---|
[백준] 9466 : 팀 프로젝트 JAVA 풀이 (0) | 2022.10.25 |
[백준] 1967 : 트리의 지름 JAVA 풀이 (0) | 2022.10.21 |
[백준] 11725 : 트리의 부모 찾기 JAVA 풀이 (0) | 2022.10.20 |
[백준] 1991 : 트리 순회 JAVA 풀이 (0) | 2022.10.20 |