๋ฌธ์
ํ์ด
1๏ธโฃ dfs๋ฅผ ์ด์ฉํ ํ์ด
๐ก ๋ ์ค๋ฅธ Idea
์ฒ์์๋ ๋ฌธ์ ์์ ์น์ ํ๊ฒ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ๋ช ์ํด์ ์๋ ค์ค์ ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ๋ง์ด ์๊ฐํ๋ ๊ฒ ๊ฐ๋ค.
๊ทผ๋ฐ, ์ด ๋ฌธ์ ๋ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ํน์ ํด์ ๋ฌธ์ ๋ฅผ ํ๊ธฐ๋ณด๋ค๋ ๋ชจ๋ ๋ ธ๋๊ฐ ๋ฃจํธ ๋ ธ๋๊ฐ ๋ ์ ์์์ ๊ฐ์ ํด์ ํธ๋ ๊ฒ์ด ํธ๋ฆฌํ๋ค.
์์์์ ๋์จ ๊ทธ๋ฆผ์ ์์ ๊ฐ์๋ฐ ์ฌ์ค ์ ๊ทธ๋ฆผ์
9 ๋ฅผ ์ต์๋จ ๋ ธ๋๋ผ๊ณ ์๊ฐํ๊ณ ๊ทธ๋ฆฌ๋ฉด ์์ ๊ฐ์ด ๊ทธ๋ ค์ง ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ 9 → 5 → 3 → 6 → 12 ๋ ธ๋ ์์ผ๋ก ๊ฐ๋ฉด ์์ ์ ๋ต์ด ๋์จ๋ค๋ ์ฌ์ค์ ์ ์ ์๋ค.
์ฆ, ๋ชจ๋ ๋ ธ๋๋ฅผ ์ต์๋จ ๋ฃจํธ๋ก ๊ฐ์ ํด๋ณด๊ณ
๊ฐ ๋ฃจํธ์์ dfs ๋ก ๊น์ด ํ์์ ํ์ ๋, ๊ฐ์ค์น๋ฅผ ์ต๋๊ฐ์ผ๋ก ๊ฐฑ์ ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ต๋ ์ง๋ฆ์ ๊ตฌํ ์ ์๊ฒ ๋๋ค.
public class Main {
static int sum = 0;
static int ans = 0;
static boolean[] checked;
static Node[] nodes;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
checked = new boolean[N + 1];
nodes = new Node[N + 1];
for (int i = 0; i < N + 1; i++) {
nodes[i] = new Node(i);
}
for (int i = 0; i < N - 1; i++) {
String[] input = br.readLine().split(" ");
int u = Integer.parseInt(input[0]);
int v = Integer.parseInt(input[1]);
int cost = Integer.parseInt(input[2]);
Node U = new Node(u, cost);
Node V = new Node(v, cost);
nodes[u].connects.add(V);
nodes[v].connects.add(U);
}
for (int i = 1; i <= N; i++) {
Node root = nodes[i];
checked[root.idx] = true;
dfs(root);
checked[root.idx] = false;
}
System.out.println(ans);
}
private static void dfs(Node node) {
ans = Math.max(ans, sum);
for (Node connect : node.connects) {
if (!checked[connect.idx]) {
sum += connect.cost;
checked[connect.idx] = true;
dfs(nodes[connect.idx]);
sum -= connect.cost;
checked[connect.idx] = false;
}
}
}
static class Node {
int idx;
List<Node> connects = new ArrayList<>();
int cost;
public Node(int idx) {
this.idx = idx;
}
public Node(int idx, int cost) {
this.idx = idx;
this.cost = cost;
}
}
}
๊ฒฐ๊ณผ
2๏ธโฃ ํธ๋ฆฌ์ ํน์ง์ ์ด์ฉํ ํ์ด
๐ก
์ด ๋ฐฉ๋ฒ์ ์ด ๋ฌธ์ ์ ์ ์ฌํ ๋ฌธ์ ์ธ
https://www.acmicpc.net/problem/1167
๋ฅผ ํ์ด๋ณด๊ณ ๊นจ๋ฌ์ ๋ฐฉ๋ฒ์ด๋ค.
๊ฐ์ฅ ๊ฑฐ๋ฆฌ๊ฐ ๋จผ ๋ ๋ ธ๋, node1 ๊ณผ node2 ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์ ๋,
์์์ ๋ ธ๋ x์์ ์ถ๋ฐํด์ ์ป์ ์ต๋ ๋น์ฉ์ ๊ฒฝ๋ก์ ์ต์ข ๋์ฐฉ์ ์ node 1 ํน์ node 2๋ผ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ node 1 ์์ ์ถ๋ฐํ ์ต๋ ๋น์ฉ์ ๊ฒฝ๋ก ์ต์ข ๋์ฐฉ์ ์ node2๊ฐ ๋๋ค.
์์ ๊ทธ๋ฆผ์์๋, ํน์ ๋ ธ๋๋ฅผ ์ต์์ ๋ ธ๋๋ก ๋๊ณ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด๋ณด๋ฉด ๊ฐ์ฅ ๊ธด ๊ฒฝ๋ก์ ๋์ ํญ์ 9 ํน์ 12์์ ์ ์ ์๋ค.
์ด๋ฌํ ํน์ง์ ์ด์ฉํด์, ์์์ ๋ ธ๋ 1๋ฒ์์ ์ถ๋ฐํ์ฌ ๊ฐ์ฅ ํฐ ๋น์ฉ์ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๊ณ , ๊ทธ ๊ฒฝ๋ก ๋ ๋ ธ๋ ์ ๋ณด๋ฅผ ์ ์ฅํ ๋ค์
๊ฒฝ๋ก ๋ ๋ ธ๋ ์ ๋ณด์์ ๊ฐ์ฅ ๊ธด ๊ฒฝ๋ก๋ฅผ ์ฐพ์ผ๋ฉด, ๊ทธ ๊ฒฝ๋ก๊ฐ ํธ๋ฆฌ์์ ๊ฐ์ฅ ํฐ ๋น์ฉ์ ๊ฒฝ๋ก๊ฐ ๋จ์ ์ ์ ์๋ค.
public class Main {
static int sum = 0;
static int ans = 0;
static int maxIdx = 0;
static boolean[] checked;
static Node[] nodes;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
checked = new boolean[N + 1];
nodes = new Node[N + 1];
for (int i = 0; i < N + 1; i++) {
nodes[i] = new Node(i);
}
for (int i = 0; i < N - 1; i++) {
String[] input = br.readLine().split(" ");
int u = Integer.parseInt(input[0]);
int v = Integer.parseInt(input[1]);
int cost = Integer.parseInt(input[2]);
Node U = new Node(u, cost);
Node V = new Node(v, cost);
nodes[u].connects.add(V);
nodes[v].connects.add(U);
}
dfs(1);
dfs(maxIdx);
System.out.println(ans);
}
private static void dfs(int i) {
Node root = nodes[i];
checked[root.idx] = true;
dfs(root);
checked[root.idx] = false;
}
private static void dfs(Node node) {
if (ans < sum) {
ans = sum;
maxIdx = node.idx;
}
for (Node connect : node.connects) {
if (!checked[connect.idx]) {
sum += connect.cost;
checked[connect.idx] = true;
dfs(nodes[connect.idx]);
sum -= connect.cost;
checked[connect.idx] = false;
}
}
}
static class Node {
int idx;
List<Node> connects = new ArrayList<>();
int cost;
public Node(int idx) {
this.idx = idx;
}
public Node(int idx, int cost) {
this.idx = idx;
this.cost = cost;
}
}
}
๊ฒฐ๊ณผ
์ด์ ๋ฐฉ์์ ๋ชจ๋ ๋ ธ๋์์ ํ์์ด ํ์ํ์ง๋ง, ๋๋ฒ์งธ ํ์ด๋ 2๋ฒ์ ํ์๋ง ์ํํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์คํ์๋๊ฐ ๋น์ฝ์ ์ผ๋ก ๊ฐ์ ๋จ์ ์ ์ ์๋ค.