๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 1167_ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„

๋ฟŒ์•ผ._. 2024. 2. 2. 11:13

Gold II

๋ฌธ์ œ(์ถœ์ฒ˜: https://www.acmicpc.net/problem/1167)

< ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„ >

 

๋ฌธ์ œ ํ’€์ด 

 

์ฒ˜์Œ์—๋Š” ์ •์  1์—์„œ dfs ํƒ์ƒ‰์„ ํ†ตํ•ด ์ง€๋ฆ„์„ ๊ตฌํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ ๋ฐฉ์‹์œผ๋กœ๋Š” ๋งŒ์•ฝ ์ •์  1์—์„œ 3๊ฐœ์˜ ์ž์‹์ด ์žˆ๋‹ค๋ฉด ๊ฐ DFS๋ฅผ ํ†ตํ•ด 3๊ฐœ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๋”ํ•œ ๊ฐ’์ด ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์ด ๋˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์€ ์ž„์˜์˜ ๋‘ ์  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ ์ค‘์—์„œ ๊ฐ€์žฅ ๊ธด ๊ฒƒ์„ ๋œปํ•˜๋ฏ€๋กœ ์ œ๋Œ€๋กœ ๋œ ๋‹ต์„ ๊ตฌํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

 

ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

1. DFS๋ฅผ ํ†ตํ•ด ์ž„์˜์˜ ์ •์ (a)์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๋จผ ์ •์ (b)์„ ๊ตฌํ•จ
2. ๊ฐ€์žฅ ๋จผ ์ •์ (b)์œผ๋กœ๋ถ€ํ„ฐ DFS๋ฅผ ํ†ตํ•ด ๊ฐ€์žฅ ๋จผ ์ •์ (c)์„ ๊ตฌํ•จ
3. 2๋ฒˆ์—์„œ ๊ตฌํ•œ ๊ฐ€์žฅ ๋จผ ์ •์ (b)๊ณผ ์ƒˆ๋กœ ๊ตฌํ•œ ๊ฐ€์žฅ ๋จผ ์ •์ (c)์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์ด ๋œ๋‹ค. 

 

 

 my solution (Java)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class _1167_ { // ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„
	static int max, max_num;
	static boolean visited[];
	static ArrayList<ArrayList<Node>> list;

	static class Node {
		private int num;
		private int d;

		public Node(int num, int d) {
			this.num = num;
			this.d = d;
		}
	}

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;

		int v = Integer.parseInt(bf.readLine());

		list = new ArrayList<>();
		visited = new boolean[v + 1];

		for (int i = 0; i <= v; i++) {
			list.add(new ArrayList<>());
		}

		for (int i = 0; i < v; i++) {
			st = new StringTokenizer(bf.readLine());

			int a = Integer.parseInt(st.nextToken());
			while (st.hasMoreTokens()) {
				int b = Integer.parseInt(st.nextToken());
				if (b == -1)
					break;
				int d = Integer.parseInt(st.nextToken());
				list.get(a).add(new Node(b, d));
			}
		}

		int result = 0, result_num = 0;
		visited[1] = true;

		// ์ž„์˜์˜ ์ •์ ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๋จผ ์ •์  ๊ตฌํ•˜๊ธฐ
		for (int i = 0; i < list.get(1).size(); i++) {
			if (!visited[list.get(1).get(i).num]) {
				max = list.get(1).get(i).d;
				max_num = list.get(1).get(i).num;

				dfs(list.get(1).get(i).num, list.get(1).get(i).d);
				if (result < max) {
					result = max;
					result_num = max_num;
				}
			}
		}

		// ๊ตฌํ•ด์ง„ ์ •์ ์—์„œ ๊ฐ€์žฅ ๋จผ ์ •์  ๊ตฌํ•˜๊ธฐ
		max = 0;
		for (int i = 0; i <= v; i++) {
			visited[i]=false;
		}

		dfs(result_num, 0);

		System.out.println(max);
	}

	private static void dfs(int num, int d) {
		visited[num] = true;

		for (int i = 0; i < list.get(num).size(); i++) {
			if (!visited[list.get(num).get(i).num]) {
				if (max < d + list.get(num).get(i).d) {
					max = d + list.get(num).get(i).d;
					max_num = list.get(num).get(i).num;
				}
				dfs(list.get(num).get(i).num, d + list.get(num).get(i).d);
			}
		}
	}
}
๋ณ€์ˆ˜)
v : ์ •์ ์˜ ๊ฐœ์ˆ˜
list : ๊ฐ ์ •์ ์˜ ๊ฐ„์„ ์˜ ์ •๋ณด ์ €์žฅ
visited : ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
a, b, d : ์ •์  ๋ฒˆํ˜ธ, ์—ฐ๊ฒฐ๋œ ์ •์  ๋ฒˆํ˜ธ, ๊ทธ ์ •์ ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ
max, max_num : ์ž„์˜์˜ ์ •์ ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๋จผ ์ •์ ์˜ ๊ฑฐ๋ฆฌ์™€ ์ •์ 
result, result_num : ์ž„์˜์˜ ์ •์ ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๋จผ ์ •์ ์˜ ๊ฑฐ๋ฆฌ์™€ ์ •์ ์˜ ์ตœ๋Œ“๊ฐ’

 

Node

์ •์ ์˜ ๋ฒˆํ˜ธ์™€ ๊ฑฐ๋ฆฌ

 

Main

์ •์ ์˜ ๊ฐœ์ˆ˜์™€ ๊ฐ„์„ ์˜ ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ์ €์žฅํ•œ๋‹ค. 1๋ฒˆ ์ •์ ์„ ์‹œ์ž‘์ ์œผ๋กœ ์ž„์˜๋กœ ๋‘๊ณ  DFS๋ฅผ ํ†ตํ•ด 1๋ฒˆ ์ •์ ์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๋จผ ๊ฑฐ๋ฆฌ์— ์žˆ๋Š” ์ •์ ์„ ๊ตฌํ•œ๋‹ค. ๊ฐ€์žฅ ๋จผ ๊ฑฐ๋ฆฌ์— ์žˆ๋Š” ์ •์ ์„ ์‹œ์ž‘์ ์œผ๋กœ ๋‘๊ณ  DFS๋ฅผ ํ†ตํ•ด ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์„ ๊ตฌํ•œ๋‹ค.

 

dfs (์ •์ , ๊ฑฐ๋ฆฌ)

๋จผ์ €, ์ •์ ์„ ๋ฐฉ๋ฌธ ํ‘œ์‹œ๋กœ ๋ฐ”๊พผ๋‹ค. ํ˜„์žฌ ์ •์ ๊ณผ ์—ฐ๊ฒฐ๋œ ์ •์ ์„ ํƒ์ƒ‰ํ•˜๋ฉฐ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ฑฐ๋ฆฌ๋ฅผ ์ตœ๋Œ“๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ ํ›„ DFS ํ•จ์ˆ˜ ํ˜ธ์ถœํ•œ๋‹ค.