728x90
1167번: 트리의 지름
트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2≤V≤100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. (정점 번호는 1부터 V까지
www.acmicpc.net
문제 풀이
import java.util.*;
public class Main {
public static class Node {
int v, d;
public Node( int v, int d ) {
this.v = v;
this.d = d;
}
}
public static class Distance {
int u, d_sum;
public Distance( int u, int d_sum ) {
this.u = u;
this.d_sum = d_sum;
}
}
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(), i, u = 0, v = 0, d = 0;
List<List<Node>> e = new ArrayList<>();
for( i = 0; i < n; i++ )
e.add( new ArrayList<>() );
for( i = 0; i < n; i++ ) {
u = sc.nextInt() - 1;
while( true ) {
v = sc.nextInt() - 1;
if( v == -2 )
break;
d = sc.nextInt();
e.get( u ).add( new Node( v, d ) );
}
}
sc.close();
int d_sum, d_max = 0, s = 0;
boolean vis[];
Deque<Distance> q;
for( i = 0; i < 2; i++ ) {
vis = new boolean[n];
q = new ArrayDeque<>();
d_sum = 0;
vis[s] = true;
q.add( new Distance( s, 0 ) );
while( !q.isEmpty() ) {
Distance dis = q.remove();
u = dis.u; d_sum = dis.d_sum;
if( d_max < d_sum ) {
d_max = d_sum;
s = u;
}
for( Node ee : e.get( u ) ) {
v = ee.v; d = ee.d;
if( !vis[v] ) {
vis[v] = true;
q.add( new Distance( v, d + d_sum ) );
}
}
}
}
System.out.println( d_max );
}
}
* BFS
- Node( 연결된 정점 번호, 거리 ), Distance( 정점 번호, 거리 합 ) 클래스 작성
- 인접리스트
- 노드 번호 입력 시 1씩 뺌
- 입력받을 때 한 노드 당 연결되는 정점이 모두 주어지므로 간선 연결 시 한 번씩 연결
- BFS를 두 번 실행
1) 첫 번째에는 시작 정점이 0
2) 두 번째에는 시작 정점이 이전에 0에서 젤 먼 거리였던 끝 정점
- 큐로 트리를 탐색하면서 간선으로 연결된 거리의 합을 구해가며 가장 먼 거리(d_max)를 갱신
반응형
'코딩 문제 풀기 ( Algorithm problem solving ) > 백준 온라인 저지 ( BOJ )' 카테고리의 다른 글
[백준(Baekjoon)][자바(java)] 1991 : 트리 순회 / 트리 (0) | 2020.12.17 |
---|---|
[백준(Baekjoon)][자바(java)] 1967 : 트리의 지름 / 트리 (0) | 2020.12.17 |
[백준(Baekjoon)][자바(java)] 11725 : 트리의 부모 찾기 / 트리 (0) | 2020.12.17 |
[백준(Baekjoon)][자바(java)] 10942 : 팰린드롬? / 동적 계획법 2 (0) | 2020.12.13 |
[백준(Baekjoon)][자바(java)] 7579 : 앱 / 동적 계획법 2 (0) | 2020.12.13 |