๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฌธ์ œ

[์ž๋ฐ”] ๋ฐฑ์ค€ 11404 - ํ”Œ๋กœ์ด๋“œ

by applemango2021 2020. 12. 19.

ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•œ ๋ฌธ์ œ.

๋ชจ๋“  ์ •์ ์—์„œ ๋ชจ๋“  ์ •์ ์— ๋Œ€ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ์ผ์ข…์˜ DP๋ผ๊ณ  ํ•œ๋‹ค. 

 

3์ค‘ for๋ฌธ์œผ๋กœ ํ•ด๊ฒฐ์„ ํ•˜๋Š”๋ฐ

1๋ฒˆ์งธ for๋ฌธ : ๊ฒฝ์œ ์ง€ k

2๋ฒˆ์งธ for๋ฌธ : ์‹œ์ž‘์  i

3๋ฒˆ์งธ for๋ฌธ : ์ข…๋ฃŒ์  j

 

์ด๋ ‡๊ฒŒ ๋ชจ๋“  N์— ๋Œ€ํ•ด 3์ค‘ for๋ฌธ์„ ๋Œ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ •์ ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์€ ๋ฌธ์ œ์—์„œ๋งŒ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

๊ธฐ๋ณธ์ ์ธ ์•„์ด๋””์–ด๋Š” ๊ฒฝ์œ ์ง€์˜ ์ž…์žฅ์—์„œ ์ƒ๊ฐ์„ ํ•˜๋Š” ๊ฑฐ๋‹ค. 

์‹œ์ž‘์  i๊ฐ€ ๋‚˜ํ•œํ…Œ ์˜ค๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ + ๋‚ด๊ฐ€ ์ข…๋ฃŒ์  j๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ์‹œ์ž‘์  i์—์„œ ์ข…๋ฃŒ์  j๋กœ ๋ฐ”๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๋ณด๋‹ค ์ž‘์œผ๋ฉด ๊ฐ’์„ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค. 

 

์ฒ˜์Œ ์กฐ๊ธˆ ์˜์‹ฌ์ด ๋“ค์—ˆ๋˜ ๋ถ€๋ถ„์€ ์ •๋ง ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋กœ ๊ฐฑ์‹ ์ด ๊ฐ€๋Šฅํ•œ์ง€ ์˜€๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด 2 →4(๊ฒฝ์œ )→1(๊ฒฝ์œ ) →5 ๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๊ฐ€ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ผ๊ณ  ํ•˜์ž.

๊ทธ๋ฆฌ๊ณ  (2,4) (4,1) (1,5) ์ด๋ ‡๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 4์—์„œ 5๋กœ ๊ฐ€๋Š” ๋ฐฉ๋ฒ•๋„ 1์„ ๊ฒฝ์œ ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ฐ–์—๋Š” ์—†๋‹ค. 

์ฒ˜์Œ์—๋Š” ์‹œ์ž‘์ง€(2)์˜ ์ž…์žฅ์—์„œ ์ƒ๊ฐ์„ ํ–ˆ์—ˆ๋Š”๋ฐ, ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ๊นŒ ์ด๋ฏธ 4(๊ฒฝ์œ )์˜ for๋ฌธ์„ ํƒ€๊ณ  ์žˆ๋Š”๋ฐ, 4์—์„œ 5๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ์ธ 4 → 1(๊ฒฝ์œ ) → 5๋Š” ๋ˆ„๋ฝ๋˜๋Š” ๊ฒƒ ์•„๋‹Œ๊ฐ€? ์‹ถ์—ˆ๋‹ค. 

ํ•˜์ง€๋งŒ ๊ทธ๊ฒŒ ์•„๋‹ˆ์—ˆ๋‹ค. ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ์€ ๊ฒฝ์œ ์ง€์˜ ์ž…์žฅ์—์„œ ์ƒ๊ฐํ•ด์•ผ ํ–ˆ๋‹ค.  4 → 1(๊ฒฝ์œ ) → 5 ๋Š” 1์˜ for๋ฌธ์—์„œ ์ด๋ฏธ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์•„์„œ dist[4][5]์— ์•Œ๋งž์€ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์—ˆ๊ณ , ์ด์ œ 4์˜ ์ž…์žฅ์—์„œ ์ƒ๊ฐํ•ด๋ณด๋ฉด dist[2][4](์ง์ ‘์ ์œผ๋กœ ์ด์–ด์ ธ์žˆ๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ) + dist[4][5](1์„ ํ†ตํ•ด ์ด์–ด์ง„ ์ตœ๋‹จ๊ฑฐ๋ฆฌ)๋ฅผ ํ•ฉ์ณ์„œ dist[2][5]๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ. 

์ด ๋ฌธ์ œ๋Š” ํ”Œ๋กœ์ด๋“œ ์™€์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งŒ ์•Œ๋ฉด ํ’€๋ฆฐ๋‹ค. ๊ฐ€์ง€์น˜๊ธฐ๋Š” ํ•„์š” ์—†์ง€๋งŒ, ๋„ฃ์ž๋ฉด ์‹œ์ž‘์ง€์™€ ๊ฒฝ์œ ์ง€, ์‹œ์ž‘์ง€์™€ ๋„์ฐฉ์ง€, ๊ฒฝ์œ ์ง€์™€ ๋„์ฐฉ์ง€์˜ ์œ„์น˜๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” continue๋ฅผ ํ†ตํ•ด ๊ตฌ๋ฌธ์„ ์Šคํ‚ตํ–ˆ๋‹ค.

์•„ ๊ทธ๋ฆฌ๊ณ  ์ฒซ ๋ฒˆ์งธ ์‹œ๋„ ๋•Œ๋Š” 98%์ฏค์— 'ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค'๊ฐ€ ๋–ด์—ˆ๋Š”๋ฐ, static int MAX = 100001๋กœ ์ดˆ๊ธฐํ™”ํ•œ ๊ฒŒ ๋ฌธ์ œ์˜€๋‹ค. ํ•˜๋‚˜์˜ ๊ฑฐ๋ฆฌ์— ์ตœ๋Œ€ 10๋งŒ์˜ ๊ฐ’์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‘ ๋„์‹œ๊ฐ€ ์—ฌํƒœ๊นŒ์ง€ ํ•œ ๋ฒˆ๋„ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์•˜์Œ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 10๋งŒ x N(์ตœ๋Œ€ 100)์ธ 1000๋งŒ ์ดˆ๊ณผ๋กœ ํ•ด์ฃผ๋Š” ๊ฒŒ ์ข‹๋‹ค.

๋‹ค์ต์ŠคํŠธ๋ผ์™€ ๋‹ฌ๋ฆฌ ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ์€ ๊ฐ„์„  ๊ฐ’์ด(์ฆ‰, ๊ฑฐ๋ฆฌ) ๋งˆ์ด๋„ˆ์Šค์—ฌ๋„ ์‚ฌ์ดํด๋งŒ ์—†์œผ๋ฉด ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๋Š”๋ฐ, ์ด๊ฑด ์‚ฌ์ดํด์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ์•Œ์•˜์„ ๋•Œ ๊ณ ๋ฏผํ•ด ๋ด์•ผ ๊ฒ ๋‹ค. 

 

/*2020.12.19*/
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

	static int MAX = 10000001;
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine().trim());
		int M = Integer.parseInt(br.readLine().trim());
		
		int[][] dist = new int[N+1][N+1];
		
		//1. ๋ชจ๋“  ๊ฑฐ๋ฆฌ๋ฅผ MAX ๊ฐ’์œผ๋กœ ์ตœ๋Œ€ํ™”
		for(int i=1;i<=N;i++) {
			for(int j=1;j<=N;j++) {
				if(i==j) dist[i][j] = 0;
				else dist[i][j] = MAX;
			}
			
		}
		
		//2. ๊ฑฐ๋ฆฌ ์ž…๋ ฅ ๋ฐ›์Œ
		String[] str;
		int s,e,d;
		for(int i=1;i<=M;i++) {
			str = br.readLine().trim().split(" ");
			s = Integer.parseInt(str[0]);
			e = Integer.parseInt(str[1]);
			d = Integer.parseInt(str[2]);
			
			dist[s][e] = Math.min(dist[s][e], d);
		}
		
		//3. ํ”Œ๋กœ์ด๋“œ ์™€์…œ 
		for(int k=1;k<=N;k++) {
			
			for(int i=1;i<=N;i++) {
				if(i==k) continue;
				
				for(int j=1;j<=N;j++) {
					if(i==j || j==k ) continue;
					
					dist[i][j] = Math.min(dist[i][j], dist[i][k]+dist[k][j]);
				}
			}
		}
		
		//4. ์ถœ๋ ฅ
		StringBuilder sb = new StringBuilder();
		for(int i=1;i<=N;i++) {
			for(int j=1;j<=N;j++) {
				if(dist[i][j]==MAX) sb.append("0 ");
				else sb.append(dist[i][j]+" ");
			}
			sb.append("\n");
		}
		
		System.out.println(sb.toString().trim());
	}

}