We will find a way, we always have.

-interstellar

Problem Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 11780๋ฒˆ: ํ”Œ๋กœ์ด๋“œ 2 - Python

Redddy 2022. 9. 22. 23:12

๐Ÿ”ˆ ๋ฌธ์ œ

n(1 ≤ 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์„ ์ถœ๋ ฅํ•œ๋‹ค.
๊ทธ ๋‹ค์Œ์—๋Š” n×n๊ฐœ์˜ ์ค„์„ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. i×n+j๋ฒˆ์งธ ์ค„์—๋Š” ๋„์‹œ i์—์„œ ๋„์‹œ j๋กœ ๊ฐ€๋Š” ์ตœ์†Œ ๋น„์šฉ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๋„์‹œ์˜ ๊ฐœ์ˆ˜ k๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ, ๋„์‹œ i์—์„œ ๋„์‹œ j๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋ฅผ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด ์ถœ๋ ฅํ•œ๋‹ค. ์ด๋•Œ, ๋„์‹œ i์™€ ๋„์‹œ j๋„ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ, i์—์„œ j๋กœ ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

์˜ˆ์ œ ์ž…๋ ฅ

5
14
1 2 2
1 3 3
1 4 1
1 5 10
2 4 2
3 4 1
3 5 1
4 5 3
3 5 10
3 1 8
1 4 2
5 1 7
3 4 2
5 2 4

 

์˜ˆ์ œ ์ถœ๋ ฅ

0 2 3 1 4
12 0 15 2 5
8 5 0 1 1
10 7 13 0 3
7 4 10 6 0
0
2 1 2
2 1 3
2 1 4
3 1 3 5
4 2 4 5 1
0
5 2 4 5 1 3
2 2 4
3 2 4 5
2 3 1
3 3 5 2
0
2 3 4
2 3 5
3 4 5 1
3 4 5 2
4 4 5 1 3
0
2 4 5
2 5 1
2 5 2
3 5 1 3
3 5 2 4
0

 

๐Ÿ“š ๋ฌธ์ œ ํ’€์ด

๋ฌธ์ œ์˜ ์ถœ๋ ฅ์ด ์กฐ๊ธˆ ๊ธธ์–ด์„œ ์ด๋ฒˆ์—๋Š” ํŠน๋ณ„ํžˆ ์˜ˆ์ œ ์ถœ๋ ฅ์„ ๋„ฃ์—ˆ๋‹ค.

๋ฌธ์ œ ์ œ๋ชฉ์— ํžŒํŠธ๊ฐ€ ์žˆ๋Š”๋ฐ ์ด ๋ฌธ์ œ๋Š” ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์„œ ํ’€์ด๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ๋‹ค์Œ ๊ธ€์„ ์ฝ๊ณ  ๋‹ค์‹œ ์ด ๊ธ€์„ ์ฝ์–ด๋ณด๊ธธ ๊ถŒ์œ ํ•œ๋‹ค.

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

 

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

ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Floyd-Warshall Algorithm) ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ”Œ๋กœ์ด๋“œ์™€ ์›Œ์…œ์ด ๊ฐœ๋ฐœํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๋ชจ๋‘ ๊ณ„์‚ฐํ•œ๋‹ค. ๋ฐ

lazypazy.tistory.com

 

๊ทธ๋Ÿผ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„์œผ๋กœ n๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ i์—์„œ j๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด์ œ ์ง€๋‚˜๊ฐ€๋Š” ๋„๋กœ์˜ ๊ฐฏ์ˆ˜์™€ ๊ฒฝ๋กœ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. 

i์—์„œ j๋กœ ๊ฐˆ ๋•Œ ๋ฌด์กฐ๊ฑด ์ง€๋‚˜๊ฐ€๋Š” ๋…ธ๋“œ๋Š” ์‹œ์ž‘์ ์ธ i์™€ ๋„์ฐฉ์ ์ธ j์ด๋‹ค. ๋•Œ๋ฌธ์— ์ด ๋‘˜์€ ๊ฒฝ๋กœ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ๋‚˜์ค‘์— ์ถœ๋ ฅํ•  ๋•Œ ์ฒ˜๋ฆฌํ•˜์˜€๋‹ค. i์™€ j๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฒฝ๋กœ๊ฐ€ ์–ด๋”” ๊ฑฐ์ณ ๊ฐ€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ  i->j ๋ผ๋ฉด ๋‘˜์˜ ๊ฒฝ๋กœ ๋ฐฐ์—ด์€ [] ์„ ๋ฐ˜ํ™˜ ํ•  ๊ฒƒ์ด๋‹ค.

๋งŒ์•ฝ i์—์„œ j์˜ ์ตœ๋‹จ๊ฒฝ๋กœ๊ฐ€ i-> x -> j ๋ผ๋ฉด ๊ฒฝ๋กœ ๋ฐฐ์—ด์€ [x]๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

์ด๋ฅผ ์ฒดํฌํ•ด์ฃผ๋Š” ๋ถ€๋ถ„์€ graph[i][j] < graph[i][x] + graph[x][j] ์ผ ๋•Œ ๊ฒฝ๋กœ ๋ฐฐ์—ด์— i์—์„œ x๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ์™€ x, ๊ทธ๋ฆฌ๊ณ  x์—์„œ j๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

route[i][j] = route[i][x] + [x] + route[x][j] 

 

์ด๋ ‡๊ฒŒ ๊ฒฝ๋กœ๊นŒ์ง€ ์ž˜ ์ €์žฅํ•ด์ฃผ๊ณ  ์ถœ๋ ฅํ•  ๋•Œ len(๊ฒฝ๋กœ) + 2,(+2 ํ•œ ์ด์œ ๋Š” ์ถœ๋ฐœ๊ณผ ๋„์ฐฉ ๋…ธ๋“œ)์™€ ๊ฒฝ๋กœ๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋˜๊ณ  ๋งŒ์•ฝ ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค๋ฉด 0์„ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

๐Ÿ’ป ์ฝ”๋“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import sys
input = sys.stdin.readline
 
INF = int(1e9)
= int(input())
= int(input())
 
graph =[[INF]*(n+1for _ in range(n+1)]
route = [[[] for _ in range(n+1)] for _ in range(n+1)]
 
for i in range(1, n+1):
    graph[i][i] = 0
 
# ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ
for _ in range(m):
    a,b,c = map(int,input().split())
    if graph[a][b] > c:
        graph[a][b] = c
 
 
for x in range(1, n+1):
    for i in range(1, n+1):
        for j in range(1, n+1):
            if graph[i][x]+graph[x][j] < graph[i][j]: # ์ตœ๋‹จ๊ฒฝ๋กœ ๋ณ€๊ฒฝ์‹œ
                graph[i][j] = graph[i][x]+graph[x][j]
                # ๊ฒฝ๋กœ๋„ ์ƒˆ๋กœ ์ดˆ๊ธฐํ™” ํ•ด์คŒ
                route[i][j] = route[i][x][:] + [x] + route[x][j][:]
 
# ๊ฐ๊ฐ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ํ…Œ์ด๋ธ”
for i in range(1, n+1):
    for j in range(1, n+1):
        print(graph[i][j] if graph[i][j] != INF else 0, end=' ')
    print()
 
for i in range(1,n+1):
    for j in range(1,n+1):
        if i==j: # ๊ฐ™์€ ์ž๋ฆฌ
            print(0)
        elif graph[i][j] == INF: # ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค๋ฉด
            print(0)
        else:
            print(len(route[i][j])+2, i, *route[i][j], j) # ๊ธธ์ด, ์‹œ์ž‘, ๊ฒฝ๋กœ, 
 
cs

 

๐Ÿญ ์‹œํ–‰์ฐฉ์˜ค

100%์—์„œ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค ํŒ์ •์„ ๋ฐ›์€ ์ด์œ ๋Š” ๋„๋‹ฌํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฒดํฌํ•ด์ฃผ์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ตœ์ ํ™” ๋œ ์ฝ”๋“œ๋Š” ์œ„์˜ ์ฝ”๋“œ์™€ ๊ฐ™์€๋ฐ ์ด์ „ ์ฝ”๋“œ๋Š” 

route[i][j] = route[i][x] + [x] + route[x][j] ์ด ๋ถ€๋ถ„์„ for ๋ฌธ๊ณผ append๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ์—ˆ์—ˆ๋‹ค.

 

๐Ÿ”— ๋ฌธ์ œ๋งํฌ ํ”Œ๋กœ์ด๋“œ 2

 

11780๋ฒˆ: ํ”Œ๋กœ์ด๋“œ 2

์ฒซ์งธ ์ค„์— ๋„์‹œ์˜ ๊ฐœ์ˆ˜ n์ด ์ฃผ์–ด์ง€๊ณ  ๋‘˜์งธ ์ค„์—๋Š” ๋ฒ„์Šค์˜ ๊ฐœ์ˆ˜ m์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์…‹์งธ ์ค„๋ถ€ํ„ฐ m+2์ค„๊นŒ์ง€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฒ„์Šค์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋จผ์ € ์ฒ˜์Œ์—๋Š” ๊ทธ ๋ฒ„์Šค์˜ ์ถœ๋ฐœ ๋„์‹œ์˜ ๋ฒˆํ˜ธ๊ฐ€

www.acmicpc.net