๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/1719)
< ํ๋ฐฐ >
๋ฌธ์  ํ์ด
๋ฐ์ดํฌ์คํธ๋ผ๋ฅผ ์ฌ์ฉํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
my solution (Java)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class _1719_ { // ํ๋ฐฐ
	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(bf.readLine());
		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());
		int dist[][] = new int[n + 1][n + 1];
		int answer[][] = new int[n + 1][n + 1];
		ArrayList<ArrayList<int[]>> list = new ArrayList<>();
		for (int i = 0; i < n + 1; i++) {
			list.add(new ArrayList<>());
			if (i == 0) {
				continue;
			}
			for (int j = 0; j < n + 1; j++) {
				if (j == 0) {
					continue;
				}
				dist[i][j] = Integer.MAX_VALUE;
			}
		}
		for (int i = 0; i < m; i++) {
			st = new StringTokenizer(bf.readLine());
			int start = Integer.parseInt(st.nextToken());
			int end = Integer.parseInt(st.nextToken());
			int d = Integer.parseInt(st.nextToken());
			list.get(start).add(new int[] { end, d });
			list.get(end).add(new int[] { start, d });
		}
		PriorityQueue<int[]> queue = new PriorityQueue<>(new Comparator<int[]>() {
			@Override
			public int compare(int[] o1, int[] o2) {
				return o1[1] - o2[1];
			}
		});
		for (int i = 1; i <= n; i++) {
			queue.add(new int[] { i, 0 });
			while (!queue.isEmpty()) {
				int info[] = queue.poll();
				if (info[1] > dist[i][info[0]]) {
					continue;
				}
				for (int j = 0; j < list.get(info[0]).size(); j++) {
					int temp[] = list.get(info[0]).get(j);
					if (temp[0] == i)
						continue;
					if (info[1] + temp[1] < dist[i][temp[0]]) {
						dist[i][temp[0]] = info[1] + temp[1];
						queue.add(new int[] { temp[0], info[1] + temp[1] });
						if (answer[i][info[0]] == 0)
							answer[i][temp[0]] = temp[0];
						else
							answer[i][temp[0]] = answer[i][info[0]];
					}
				}
			}
		}
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				if (i == j)
					bw.write("- ");
				else
					bw.write(answer[i][j] + " ");
			}
			bw.write("\n");
		}
		bw.flush();
	}
}๋ณ์)
n, m : ์งํ์ฅ์ ๊ฐ์, ์งํ์ฅ๊ฐ ๊ฒฝ๋ก์ ๊ฐ์
dist : ์ต๋จ ์๊ฐ
answer : ๊ฒฝ๋กํ
list : ๋ ์งํ์ฅ ๊ด๊ณ
start, end, d : ๋ ์งํ์ฅ์ ๋ฒํธ, ๊ทธ ์ฌ์ด๋ฅผ ์ค๊ฐ๋๋ฐ ํ์ํ ์๊ฐ
queue : ์ฐ์ ์์ ํ [์งํ์ฅ ๋ฒํธ, ์๊ฐ]
์งํ์ฅ์ ๊ฐ์์ ์งํ์ฅ๊ฐ ๊ฒฝ๋ก์ ๊ฐ์๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค. ์งํ์ฅ๊ฐ ๊ฒฝ๋ก๋ฅผ ์ ๋ ฅ๋ฐ์ ArrayList์ ์ ์ฅํ๋ค. ์ฐ์ ์์ ํ์๋ [์งํ์ฅ ๋ฒํธ, ์๊ฐ]์ ์ ์ฅํ๋ฉฐ ์๊ฐ์ด ์งง์ ๊ฒ์ ์ฐ์ ์์๋ก ๋๋ค. ๋ชจ๋ ์งํ์ฅ์์ ๋ค๋ฅธ ์งํ์ฅ์ผ๋ก ๊ฐ ๋ ๊ฐ์ฅ ๋จผ์  ๊ฑฐ์ณ์ผ ํ๋ ์งํ์ฅ์ ๊ตฌํด์ผ ํ๋ฏ๋ก ๋ฐ๋ณต๋ฌธ์ ํตํด ์ ์ฒด ๊ณ์ฐํ๋ค.
์ฒ์์๋ ์์ ์งํ์ฅ์ ์ฐ์ ์์ ํ์ ์ ์ฅํ๋ค. ๊ทธ ํ ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณตํ๋ค. ํ์์ ๊ฐ์ ํ๋ ๊บผ๋ด์ ๊ทธ ์๊ฐ์ด ํ์ฌ ์ ์ฅ๋ ์๊ฐ๋ณด๋ค ํฌ๋ค๋ฉด ๊ณ์ฐํ ํ์ ์์ผ๋ฏ๋ก ๋ค์์ผ๋ก ๋์ด๊ฐ๋ค. ๋ง์ฝ ์๊ฐ์ด ์ ๋ค๋ฉด ๊ทธ ์งํ์ฅ๊ณผ ์ฐ๊ฒฐ๋ ์งํ์ฅ์ ํ์ํ๋ค. ์ฐ๊ฒฐ๋ ์งํ์ฅ์ผ๋ก ์ด๋ํ์ ๋ ์ต๋จ์๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ ๊ฐ๋ฅํ๋ค๋ฉด ์ ๋ฐ์ดํธ ํ ์ฐ์ ์์ ํ์ ์ ์ฅํ๋ค. ๋ํ, ๊ฐ์ฅ ๋จผ์  ๊ฑฐ์ณ์ผ ํ๋ ์งํ์ฅ์ ๊ตฌํด์ผ ํ๋ฏ๋ก answer ๋ฐฐ์ด์๋ ๊ฐ์ ์ ์ฅํ๋ค. ์ด๋, ๋ง์ฝ answer ๊ฐ์ด 0์ด๋ผ๋ฉด ์์ง ๋ค๋ฅธ ์งํ์ฅ์ ๊ฑฐ์น์ง ์์ ๊ฒ์ด๋ฏ๋ก ์๊ธฐ ์์ ์ ๋ฃ๊ณ , ๋ค๋ฅธ ๊ฐ์ด ์๋ค๋ฉด ๊ทธ ์งํ์ฅ์ ๊ฑฐ์น ํ์ ๊ฑฐ์ณ์ผ ํ๋ฏ๋ก ๊ทธ ๊ฐ์ ์ ์ฅํ๋ค.
์ต์ข answer ๋ฐฐ์ด์ ์ถ๋ ฅํ๋ค.

'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Baekjoon] 1865_์ํ (0) | 2024.01.12 | 
|---|---|
| [Baekjoon] 9694_๋ฌด์์ ์๋๋๊ฐ ์๋๋ผ ๋๊ตฌ๋ฅผ ์๋๋๊ฐ ๋ฌธ์ ๋ค (1) | 2024.01.11 | 
| [Baekjoon] 11779_์ต์๋น์ฉ ๊ตฌํ๊ธฐ 2 (0) | 2024.01.09 | 
| [Baekjoon] 1238_ํํฐ (2) | 2024.01.08 | 
| [Baekjoon] 1895_ํํฐ (1) | 2024.01.05 |