Algorithm/BFS & DFS
[๋ฐฑ์ค, Java] 1967๋ฒ : ํธ๋ฆฌ์ ์ง๋ฆ
Zayson
2022. 5. 8. 16:01
๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1967
๐ฎ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
Map์ ์ด์ฉํด ํธ๋ฆฌ๋ฅผ ๋ง๋ค์ด ์ค๋ค.
๋ฌธ์ ์์ ๋ฃจํธ๋ ธ๋๊ฐ 1์ด๋ผ๊ณ ์ฃผ์ด์ก๊ธฐ ๋๋ฌธ์ ๋ฃจํธ ๋ ธ๋๋ฅผ ์ด์ฉํด ๊ฐ์ฅ ๋ฉ๋ฆฌ ์๋ ๋ ธ๋๋ฅผ ๋จผ์ ํ์ํ๋ค.
๊ฐ์ฅ ๋จผ ๋ ธ๋๋ฅผ ์ฐพ์๋ค๋ฉด, ํด๋น ๋ ธ๋๋ก ๋ค์ ๊ฐ์ฅ ๋จผ ๋ ธ๋๋ฅผ ํ์ํ๋ฉด ๋ ธ๋์ ๋ ธ๋๊ฐ ๊ฐ์ฅ ๋จผ ์ง๋ฆ์ด ํ์๋๋ค.
- ๋ฃจํธ ๋ ธ๋๋ฅผ ์ด์ฉํด DFS ํ์ ๋ฐ ๊ฐ์ฅ ๋จผ ๋ ธ๋ ์ฐพ๊ธฐ
- ํ์ํ ๊ฐ์ฅ ๋จผ ๋ ธ๋๋ฅผ ์ด์ฉํด ๋ค์ ํ๋ฒ DFS ํ์ ๋ฐ ์ง๋ฆ ๊ฐฑ์
๐ฉ Java ์ฝ๋
package com.algorithm.Baekjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main_1967_ํธ๋ฆฌ์_์ง๋ฆ {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
Map<Integer, List<Node>> tree = new HashMap<>();
// ํธ๋ฆฌ ์ด๊ธฐํ
for (int node = 0; node <= N; node++) {
tree.put(node, new ArrayList<>());
}
// ํธ๋ฆฌ ์ฐ๊ฒฐ
for (int edge = 0; edge < N - 1; edge++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int parent = Integer.parseInt(st.nextToken());
int child = Integer.parseInt(st.nextToken());
int weight = Integer.parseInt(st.nextToken());
tree.get(parent).add(new Node(child, weight));
tree.get(child).add(new Node(parent, weight));
}
int rst = getTreeLength(N, tree);
System.out.println(rst);
br.close();
}
private static int getTreeLength(int size, Map<Integer, List<Node>> tree) {
startNode = maxStartLength = 0;
boolean[] visited = new boolean[size + 1];
// ๋ฃจํธ ๋
ธ๋๋ถํฐ ๊ฐ์ฅ ๋จผ ๋
ธ๋ ์ฐพ๊ธฐ
getMaxLength(1, visited, tree, 0);
// ๊ฐ์ฅ ๋จผ ๋
ธ๋๋ก ๋ค์ DFS
visited = new boolean[size + 1];
maxStartLength = 0; // ์ต์ฅ ์ง๋ฆ ๊ธธ์ด ์ด๊ธฐํ
getMaxLength(startNode, visited, tree, 0);
return maxStartLength;
}
private static int startNode, maxStartLength;
private static void getMaxLength(int node, boolean[] visited, Map<Integer, List<Node>> tree, int weight) {
visited[node] = true;
for (Node next : tree.get(node)) {
if (!visited[next.getNode()]) {
if (next.getWeight() + weight > maxStartLength) {
startNode = next.getNode();
maxStartLength = next.getWeight() + weight;
}
getMaxLength(next.getNode(), visited, tree, weight + next.getWeight());
}
}
}
static class Node {
private int node;
private int weight;
public Node(int node, int weight) {
this.node = node;
this.weight = weight;
}
public int getNode() {
return node;
}
public int getWeight() {
return weight;
}
}
}
๋ฐ์ํ