Algorithm & Data Structures/BOJ

b11780. ํ”Œ๋กœ์ด๋“œ 2

Geisha 2025. 4. 25. 02:00

 

https://www.acmicpc.net/problem/11780

 

 

 

๐Ÿ“Œ ์ž๋ฐ”(Java)๋กœ ํ‘ธ๋Š” ํ”Œ๋กœ์ด๋“œ 2 - ๋ฐฑ์ค€ 11780 ๐Ÿ›ฃ๏ธ

์ตœ๋‹จ ๊ฑฐ๋ฆฌ + ๊ฒฝ๋กœ ์ถœ๋ ฅ๊นŒ์ง€ ํฌํ•จํ•œ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ(Floyd-Warshall)

 

๐Ÿ”Ž ๋ฌธ์ œ ๊ฐœ์š”

 

๋ฐฑ์ค€ 11780 - ํ”Œ๋กœ์ด๋“œ 2๋Š”

๋ชจ๋“  ๋„์‹œ ์Œ์— ๋Œ€ํ•ด ์ตœ๋‹จ ๊ฒฝ๋กœ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ,

๊ฐ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ง์ ‘ ๊ฒฝ๋กœ๋กœ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 



 

๐Ÿ’ก ์˜ˆ์ œ ์ž…๋ ฅ

5
14
1 2 2
1 3 3
1 4 1
...

 

๐Ÿ’ก ์˜ˆ์ œ ์ถœ๋ ฅ

0 2 3 1 10
0
2 1 2
3 1 3
2 1 4
...

 

 


๐Ÿ›  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ‘๊ทผ ๋ฐฉ์‹

 

์ด ๋ฌธ์ œ๋Š” ์ „ํ˜•์ ์ธ Floyd-Warshall (ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ) ์•Œ๊ณ ๋ฆฌ์ฆ˜์—

โœ” ๊ฒฝ๋กœ ์ถ”์ ๊นŒ์ง€ ๋ง๋ถ™์ด๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

 

  • costs[i][j]: ๋„์‹œ i์—์„œ j๊นŒ์ง€์˜ ์ตœ์†Œ ๋น„์šฉ
  • lists[i][j]: ๋„์‹œ i์—์„œ j๊นŒ์ง€ ์ด๋™ํ•  ๋•Œ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ๊ฒฝ์œ  ๋„์‹œ ๋ฆฌ์ŠคํŠธ

 


๐Ÿ”น Java ์ฝ”๋“œ ์„ค๋ช…

๐Ÿ“Œ ์ดˆ๊ธฐํ™”

costs = new int[N+1][N+1];
lists = new ArrayList[N+1][N+1];

โœ” costs[i][j]๋ฅผ INF๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋ฉฐ

โœ” ๊ฒฝ๋กœ ์ €์žฅ์šฉ lists[i][j]๋Š” ๊ฐ ์Œ๋งˆ๋‹ค ArrayList ์ƒ์„ฑ

 

๐Ÿ“Œ ๊ฐ„์„  ์ž…๋ ฅ

costs[a][b] = Math.min(cost, costs[a][b]);

โœ” ๋™์ผ ๋…ธ์„  ์ค‘ ๋” ์งง์€ ๋น„์šฉ๋งŒ ์ €์žฅ

 

๐Ÿ“Œ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ํ•ต์‹ฌ

if (costs[i][j] > costs[i][k] + costs[k][j]) {
    costs[i][j] = costs[i][k] + costs[k][j];
    routeTracking(i, j, k);
}

โœ” i → j๋กœ ๋ฐ”๋กœ ๊ฐ€๋Š” ๊ฒƒ๋ณด๋‹ค

โœ” i → k → j๊ฐ€ ๋” ์ €๋ ดํ•˜๋‹ค๋ฉด ๊ฐฑ์‹ 

โœ” ์ด ๋•Œ ๊ฒฝ๋กœ ๋ฆฌ์ŠคํŠธ๋„ ์—…๋ฐ์ดํŠธ

 

๐Ÿ“Œ ๊ฒฝ๋กœ ๊ฐฑ์‹  ํ•จ์ˆ˜

public static void routeTracking(int i, int j, int k){
    lists[i][j].clear();
    lists[i][j].addAll(lists[i][k]);
    lists[i][j].add(k);
    lists[i][j].addAll(lists[k][j]);
}

โœ” ์ค‘๊ฐ„์— k๋ฅผ ๊ฑฐ์นœ ๊ฒฝ๋กœ๋กœ ์ „์ฒด ๊ฒฝ๋กœ ์—…๋ฐ์ดํŠธ

โœ” ์žฌ๊ท€๊ฐ€ ์•„๋‹Œ ํ”Œ๋žซํ•œ ๋ฆฌ์ŠคํŠธ ๊ตฌ์กฐ ์œ ์ง€

 

๐Ÿ“Œ ์ถœ๋ ฅ

โ–ถ ๊ฑฐ๋ฆฌ ์ถœ๋ ฅ

if (costs[i][j] == INF) sb.append(0 + " ");
else sb.append(costs[i][j] + " ");

 

โ–ถ ๊ฒฝ๋กœ ์ถœ๋ ฅ

int size = lists[i][j].size();
sb.append((size + 2) + " " + i + " ");
for (int num : lists[i][j]) sb.append(num + " ");
sb.append(j + "\n");

โœ” ๊ฒฝ๋กœ ์ถœ๋ ฅ์€

 

  • ์‹œ์ž‘ ๋„์‹œ i
  • ๊ฒฝ์œ ์ง€๋“ค
  • ๋„์ฐฉ ๋„์‹œ j
  • ๊นŒ์ง€ ๋ชจ๋‘ ํฌํ•จ

๐Ÿ† ์ •๋ฆฌ

โœ… ํ•ต์‹ฌ ํฌ์ธํŠธ

  • Floyd-Warshall ๊ธฐ๋ณธ ๊ตฌ์กฐ๋Š” O(N³)
  • ๊ฒฝ๋กœ ์ €์žฅ์€ ์ค‘๊ฐ„ ๊ฒฝ์œ ์ง€๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ๋ˆ„์ 
  • ๊ฒฝ๋กœ ์ถœ๋ ฅ์ด ํ•„์š”ํ•  ๋•Œ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ง์ ‘ ๋ณต์‚ฌ + ์—ฐ๊ฒฐ