๐Ÿ“ฆ๋ฐฑ์ค€ 1719 : ํƒ๋ฐฐ

๊ธ๊ธยท2025๋…„ 10์›” 10์ผ

์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ชฉ๋ก ๋ณด๊ธฐ
21/30

๋ฌธ์ œ

1719๋ฒˆ : ํƒ๋ฐฐ
LV ๊ณจ๋“œ 3

๊ทธ๋ž˜ํ”„์—์„œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค.
๋‹ค๋ฅธ ๋ฌธ์ œ์™€์˜ ์ฐจ์ด์ ์€ '์ตœ๋‹จ๊ฒฝ๋กœ'๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ '์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ์œ„ํ•ด ์ฒซ๋ฒˆ์งธ๋กœ ๋ฐฉ๋ฌธํ•ด์•ผ ํ•˜๋Š” ๋…ธ๋“œ'๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

ํ’€์ด ๊ณผ์ •

ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

'์–ด๋””๋ฅผ ๊ฑฐ์ณค์„ ๋•Œ ๊ฐ€์žฅ ๊ฐ€๊น๋ƒ'๋ฅผ ๋ฌผ์–ด๋ณด๋Š” ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์— '์ค‘๊ฐ„์ง€์ '์„ ์žก๊ณ  ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

์ฃผ์˜ํ•  ์ 

๊ทธ๋ ‡๊ฒŒ ์ˆœ์กฐ๋กญ๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋‚˜๊ฐ”๋Š”๋ฐ, ๋”ฑ ํ•˜๋‚˜์˜ ๊ฒฝ๋กœ๊ฐ€ ์•ˆ ๋งž๋Š” ๊ฒƒ์ด๋‹ค...

๋จธ๋ฆฌ๋ฅผ ๋ถ™์žก๊ณ  ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ G์„ ์ƒ์—๊ฒŒ ๋ฌผ์–ด๋ณด๋‹ˆ...

๊ฐ€์žฅ ๋จผ์ € ๋ฐฉ๋ฌธํ•ด์•ผ ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์ž‘์„ฑ์„ ํ•˜์˜€๋‹ค.
i๋Š” ์ค‘๊ฐ„์ง€์ ์„ ์˜๋ฏธํ•œ๋‹ค.

fBoard[from][to] = i;

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์—์„œ ์ค‘๊ฐ„์ง€์ ์€ '๊ฐ€์žฅ ๋จผ์ € ๋ฐฉ๋ฌธํ•˜๋Š” ๋…ธ๋“œ'๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ •๋‹ต์„ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

fBoard[from][to] = fBoard[from][i];

์ด ๋ถ€๋ถ„๋งŒ ์ฃผ์˜ํ•˜๋ฉด ๋‚˜๋จธ์ง€๋Š” ์ผ๋ฐ˜์ ์ธ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ๊ณผ ๋™์ผํ•˜๋‹ค.

์ „์ฒด์ฝ”๋“œ


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class backjoon_1719_ํƒ๋ฐฐ {
	public static void main(String[] args) throws IOException {
		System.setIn(new FileInputStream("src/input.txt"));

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		StringTokenizer st = new StringTokenizer(br.readLine());

		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());

		// ์ด์ฐจ์› ๋ฐฐ์—ด ์ƒ์„ฑ
		int[][] board = new int[n + 1][n + 1];

		// ์ฒซ๋ฒˆ์งธ๋กœ ๊ฑฐ์ณ๊ฐ€์•ผ ํ•˜๋Š” ๋ถ€๋ถ„
		int[][] fBoard = new int[n + 1][n + 1];

		for (int i = 0; i < m; i++) {
			st = new StringTokenizer(br.readLine());
			int from = Integer.parseInt(st.nextToken());
			int to = Integer.parseInt(st.nextToken());
			int w = Integer.parseInt(st.nextToken());

			// ์–‘๋ฐฉํ–ฅ ๊ฐ„์„ 
			board[from][to] = w;
			board[to][from] = w;

			fBoard[from][to] = to;
			fBoard[to][from] = from;

		}


		// ์ค‘๊ฐ„ ๋‹ค๋ฆฌ
		for (int i = 1; i < n + 1; i++) {
			for (int from = 1; from < n + 1; from++) {
				if (from == i)
					continue;
				for (int to = 1; to < n + 1; to++) {
					if (from == to)
						continue;

					// ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๋งŒ ๊ณ ๋ ค
					if (board[from][i] > 0 && board[i][to] > 0) {
						// ์ง์ ‘ ์—ฐ๊ฒฐ์ด ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ƒˆ๋กœ์šด ๊ฑธ๋กœ ์—…๋ฐ์ดํŠธ
						if (board[from][to] == 0) {
							board[from][to] = board[from][i] + board[i][to];
							
							//๊ฒฝ๋กœ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ๊ณผ์ •
							fBoard[from][to] = fBoard[from][i];
						}

						// ์ง์ ‘ ๊ฐ€๋Š” ๊ฒƒ๋ณด๋‹ค ์ค‘๊ฐ„๋‹ค๋ฆฌ๋ฅผ ํ†ตํ•ด์„œ ๊ฐ€๋Š” ๊ฒŒ ๋” ๋น ๋ฅด๋‹ค๋ฉด
						else if (board[from][to] > board[from][i] + board[i][to]) {

							board[from][to] = board[from][i] + board[i][to];
							fBoard[from][to] = fBoard[from][i];
						}



					}
				}

			}
		}

		// ์ถœ๋ ฅํ•˜๊ธฐ
		for (int i = 1; i < n + 1; i++) {
			for (int j = 1; j < n + 1; j++) {
				if (i == j) {
					System.out.print("-");
				} else {
					System.out.print(fBoard[i][j]);
				}
				System.out.print(" ");
			}
			System.out.println();
		}
		System.out.println();


	}

}

0๊ฐœ์˜ ๋Œ“๊ธ€