[Algorithm] ๐Ÿ˜ˆ๋ฐฑ์ค€ 11404 ํ”Œ๋กœ์ด๋“œ

HaJingJingยท2021๋…„ 5์›” 23์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
49/119

0. ๋ฌธ์ œ

n(2 โ‰ค n โ‰ค 100)๊ฐœ์˜ ๋„์‹œ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•œ ๋„์‹œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๋„์‹œ์— ๋„์ฐฉํ•˜๋Š” m(1 โ‰ค m โ‰ค 100,000)๊ฐœ์˜ ๋ฒ„์Šค๊ฐ€ ์žˆ๋‹ค. ๊ฐ ๋ฒ„์Šค๋Š” ํ•œ ๋ฒˆ ์‚ฌ์šฉํ•  ๋•Œ ํ•„์š”ํ•œ ๋น„์šฉ์ด ์žˆ๋‹ค.

๋ชจ๋“  ๋„์‹œ์˜ ์Œ (A, B)์— ๋Œ€ํ•ด์„œ ๋„์‹œ A์—์„œ B๋กœ ๊ฐ€๋Š”๋ฐ ํ•„์š”ํ•œ ๋น„์šฉ์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ
์ฒซ์งธ ์ค„์— ๋„์‹œ์˜ ๊ฐœ์ˆ˜ n์ด ์ฃผ์–ด์ง€๊ณ  ๋‘˜์งธ ์ค„์—๋Š” ๋ฒ„์Šค์˜ ๊ฐœ์ˆ˜ m์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์…‹์งธ ์ค„๋ถ€ํ„ฐ m+2์ค„๊นŒ์ง€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฒ„์Šค์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋จผ์ € ์ฒ˜์Œ์—๋Š” ๊ทธ ๋ฒ„์Šค์˜ ์ถœ๋ฐœ ๋„์‹œ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋ฒ„์Šค์˜ ์ •๋ณด๋Š” ๋ฒ„์Šค์˜ ์‹œ์ž‘ ๋„์‹œ a, ๋„์ฐฉ ๋„์‹œ b, ํ•œ ๋ฒˆ ํƒ€๋Š”๋ฐ ํ•„์š”ํ•œ ๋น„์šฉ c๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์‹œ์ž‘ ๋„์‹œ์™€ ๋„์ฐฉ ๋„์‹œ๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์—†๋‹ค. ๋น„์šฉ์€ 100,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

์‹œ์ž‘ ๋„์‹œ์™€ ๋„์ฐฉ ๋„์‹œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋…ธ์„ ์€ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ๋‹ค.

์ถœ๋ ฅ
n๊ฐœ์˜ ์ค„์„ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. i๋ฒˆ์งธ ์ค„์— ์ถœ๋ ฅํ•˜๋Š” j๋ฒˆ์งธ ์ˆซ์ž๋Š” ๋„์‹œ i์—์„œ j๋กœ ๊ฐ€๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ ๋น„์šฉ์ด๋‹ค. ๋งŒ์•ฝ, i์—์„œ j๋กœ ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ ์ž๋ฆฌ์— 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

1. ์•„์ด๋””์–ด

๐Ÿ’ก ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜
โ†’ ๋ชจ๋“  ์ •์  ์‚ฌ์ด์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ์ฐพ๊ธฐ (n:m)

VS ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ํ•œ ์ •์ ์—์„œ ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ์ฐพ๊ธฐ (1:n)

๐Ÿ’ก ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์ •์ ์˜ ๋น„์šฉ์œผ๋กœ ๋ฐฐ์—ด์— ์‚ฝ์ž…
๐Ÿ’ก ํ•œ ์ ์„ ๊ฒฝ์œ ํ•ด์„œ ๊ฐ€๋Š” ๋น„์šฉ์„ ๊ตฌํ•œ ํ›„, ์ด์ „ ๋น„์šฉ๊ณผ ๋น„๊ตํ•˜์—ฌ ๋” ์ž‘์€ ์ˆ˜๋กœ ๊ฐฑ์‹ ํ•จ

2. ํ•ต์‹ฌ ํ’€์ด

1) ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์ •์ ์˜ ๋น„์šฉ์œผ๋กœ ๋ฐฐ์—ด์— ์‚ฝ์ž…

for(int i=1; i<n+1; i++) {
	for(int j=1; j<n+1; j++) {
		if(i == j) 
			continue;
		arr[i][j] = INF;
	}
}

2) ํ•œ ์ ์„ ๊ฒฝ์œ ํ•ด์„œ ๊ฐ€๋Š” ๋น„์šฉ์„ ๊ตฌํ•œ ํ›„, ์ด์ „ ๋น„์šฉ๊ณผ ๋น„๊ตํ•˜์—ฌ ๋” ์ž‘์€ ์ˆ˜๋กœ ๊ฐฑ์‹ ํ•จ

for(int mid=1; mid<n+1; mid++) {
	for(int start=1; start<n+1; start++) {
		for(int end=1; end<n+1; end++) {
			arr[start][end] = Math.min(arr[start][mid]+arr[mid][end], arr[start][end]);
		}
	}
}

3. ์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Graph_2 {
	static int[][] arr;
	static int INF = 10000000;
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int n = Integer.parseInt(br.readLine());
		int m = Integer.parseInt(br.readLine());
		
		arr = new int[n+1][n+1];
		
		for(int i=1; i<n+1; i++) {
			for(int j=1; j<n+1; j++) {
				if(i == j) 
					continue;
				arr[i][j] = INF;
			}
		}
		
		for(int i=0; i<m; i++) {
			String[] s = br.readLine().split(" ");
			int start = Integer.parseInt(s[0]);
			int end = Integer.parseInt(s[1]);
			int cost = Integer.parseInt(s[2]);
			arr[start][end] = Math.min(cost,arr[start][end]);
		}
		
		for(int mid=1; mid<n+1; mid++) {
			for(int start=1; start<n+1; start++) {
				for(int end=1; end<n+1; end++) {
					arr[start][end] = Math.min(arr[start][mid]+arr[mid][end], arr[start][end]);
				}
			}
		}
		
		for(int i=1; i<n+1; i++) {
			for(int j=1; j<n+1; j++) {
				if(arr[i][j] >= INF)
					sb.append("0 ");
				else
					sb.append(arr[i][j]+" ");
			}
			sb.append("\n");
		}
		
		System.out.println(sb.toString());
	}

}

4. ๊ฒฐ๊ณผ

์„ฑ๊ณตโœจ
(INF ๊ฐ’์„ Integer.MAX_VALUE๋กœ ์žก์•˜๋‹ค๊ฐ€ ๊ณ„์† ํ‹€๋ ธ๋‹ค. Integer.MAX_VALUE์—์„œ ๋‹ค๋ฅธ ์ˆซ์ž๋“ค์„ ๋”ํ•  ๋•Œ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜๋‹ค๐Ÿ˜ฑ)

profile
๐ŸŒฑ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๐ŸŒฑ

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