![[BOJ1167] 트리의 지름 (트리)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJbVwd%2Fbtstr31vDel%2Fk78y0uQVlWawF9MqzSD0dk%2Fimg.png)

[BOJ1167] 트리의 지름 (트리)알고리즘/트리2023. 9. 7. 23:36
Table of Contents
반응형
문제 링크
https://www.acmicpc.net/problem/1167
1167번: 트리의 지름
트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지
www.acmicpc.net
문제 풀이
- 앞서 MST 문제 풀이하다가 '트리의 지름'에 대한 이론을 알게 되었고, 관련 문제 풀이함
'트리의 지름'에 대한 강의 영상을 찾아보니 초보 알고리즘이란다 (하하하.. 심플하긴하다)
https://dev-ljw1126.tistory.com/369
[BOJ20010] 악덕 영주 혜유 (크루스칼, 프림, MST, 최소신장트리, 트리의 지름)
문제 링크 https://www.acmicpc.net/problem/20010 20010번: 악덕 영주 혜유 FT온라인 게임에서 치열한 경쟁을 통해 영주가 된 혜유는 퀘스트를 받았다. 퀘스트의 내용은 자신이 관리하고 있는 마을 사이에 교
dev-ljw1126.tistory.com
절차
총 DFS 두 번 실행한다
1) 인접 리스트로 간선의 정보를 정의한다.
2) 임의 노드 (시작 노드 1로 지정)에서 dfs 실행하여 최대 가중치를 가지는 leaf 노드를 구한다
이때 구한 leaf 노드가 트리의 지름을 구성하는 노드 중 하나이다
3) 데이터 초기화 후 2)에서 구한 leaf 노드 시작점으로 하여 한번 더 dfs 수행
이때 구한 최대 가중치가 트리의 지름이 된다
제출 코드
import java.util.*;
import java.io.*;
public class Main {
static int N;
static int leaf, max;
static List<Edge>[] adj;
static boolean[] visit;
static class Edge {
int idx;
int cost;
public Edge(int idx, int cost) {
this.idx = idx;
this.cost = cost;
}
}
static void input() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine()); // 정점의 개수
adj = new ArrayList[N + 1];
for(int i = 1; i <= N; i++) adj[i] = new ArrayList<>();
// 정점 / (연결 정점과 가중치).. / -1(끝)
for(int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
int from = Integer.parseInt(st.nextToken());
int to;
while((to = Integer.parseInt(st.nextToken())) != -1) {
int cost = Integer.parseInt(st.nextToken());
adj[from].add(new Edge(to, cost));
adj[to].add(new Edge(from, cost));
}
}
}
static void dfs(int node, int dist) {
visit[node] = true;
if(max < dist) {
max = dist;
leaf = node;
}
for(Edge next : adj[node]) {
if(!visit[next.idx]) dfs(next.idx, dist + next.cost);
}
}
static void pro() {
// 트리의 지름을 구성하는 leaf 노드를 구함
visit = new boolean[N + 1];
dfs(1, 0);
// leaf 노드 시작으로 최대 가중치 구함 (= 트리의 지름)
Arrays.fill(visit, false);
dfs(leaf, 0);
System.out.println(max);
}
public static void main(String[] args) throws Exception {
input();
pro();
}
}
반응형
'알고리즘 > 트리' 카테고리의 다른 글
[BOJ2263] 트리의 순회(분할 정복) (0) | 2024.02.24 |
---|---|
[BOJ1967] 트리의 지름(dfs, 인접 리스트) (0) | 2023.09.21 |
[BOJ 14267] 회사 문화1 (Java, DFS, Tree) (0) | 2023.06.26 |
[BOJ 1068] 트리 (Java, DFS) (0) | 2023.06.26 |
[BOJ 9489] 사촌 (Java, 트리) (0) | 2023.06.26 |

@leejinwoo1126 :: 천천히 하나씩
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!