We will find a way, we always have.

-interstellar

Problem Solving/λ°±μ€€

[λ°±μ€€] 1719번: 택배 - 파이썬

Redddy 2022. 12. 21. 19:45

πŸ”ˆ 문제

λͺ…μš°κΈ°μ—…μ€ 2008λ…„λΆ€ν„° 택배 사업을 μƒˆλ‘œμ΄ μ‹œμž‘ν•˜κΈ°λ‘œ ν•˜μ˜€λ‹€. μš°μ„  택배 화물을 λͺ¨μ•„μ„œ μ²˜λ¦¬ν•˜λŠ” μ§‘ν•˜μž₯을 λͺ‡ 개 λ§ˆλ ¨ν–ˆμ§€λ§Œ, 택배 화물이 각 μ§‘ν•˜μž₯λ“€ 사이λ₯Ό 였갈 λ•Œ μ–΄λ–€ 경둜λ₯Ό 거쳐야 ν•˜λŠ”μ§€ κ²°μ •ν•˜μ§€ λͺ»ν–ˆλ‹€. μ–΄λ–€ 경둜λ₯Ό 거칠지 μ •ν•΄μ„œ, 이λ₯Ό κ²½λ‘œν‘œλ‘œ μ •λ¦¬ν•˜λŠ” 것이 μ—¬λŸ¬λΆ„μ΄ ν•  일이닀.

μ˜ˆμ‹œλœ κ·Έλž˜ν”„μ—μ„œ ꡡ게 ν‘œμ‹œλœ 1, 2, 3, 4, 5, 6은 μ§‘ν•˜μž₯을 λ‚˜νƒ€λ‚Έλ‹€. μ •μ κ°„μ˜ 간선은 두 μ§‘ν•˜μž₯간에 ν™”λ¬Ό 이동이 κ°€λŠ₯함을 λ‚˜νƒ€λ‚΄λ©°, κ°€μ€‘μΉ˜λŠ” 이동에 κ±Έλ¦¬λŠ” μ‹œκ°„μ΄λ‹€. μ΄λ‘œλΆ€ν„° μ–»μ–΄λ‚΄μ•Ό ν•˜λŠ” κ²½λ‘œν‘œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

κ²½λ‘œν‘œλŠ” ν•œ μ§‘ν•˜μž₯μ—μ„œ λ‹€λ₯Έ μ§‘ν•˜μž₯으둜 μ΅œλ‹¨κ²½λ‘œλ‘œ 화물을 μ΄λ™μ‹œν‚€κΈ° μœ„ν•΄ κ°€μž₯ λ¨Όμ € 거쳐야 ν•˜λŠ” μ§‘ν•˜μž₯을 λ‚˜νƒ€λ‚Έ 것이닀. 예λ₯Ό λ“€μ–΄ 4ν–‰ 5μ—΄μ˜ 6은 4번 μ§‘ν•˜μž₯μ—μ„œ 5번 μ§‘ν•˜μž₯으둜 μ΅œλ‹¨ 경둜λ₯Ό 톡해 κ°€κΈ° μœ„ν•΄μ„œλŠ” 제일 λ¨Όμ € 6번 μ§‘ν•˜μž₯으둜 이동해야 ν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€.
이와 같은 κ²½λ‘œν‘œλ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

κ·Έλž˜ν”„

 

ν‘œ

 

πŸ“μž…λ ₯

첫째 쀄에 두 수 nκ³Ό m이 빈 칸을 사이에 두고 μˆœμ„œλŒ€λ‘œ 주어진닀. n은 μ§‘ν•˜μž₯의 개수둜 200μ΄ν•˜μ˜ μžμ—°μˆ˜, m은 μ§‘ν•˜μž₯κ°„ 경둜의 개수둜 10000μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€. μ΄μ–΄μ„œ ν•œ 쀄에 ν•˜λ‚˜μ”© μ§‘ν•˜μž₯κ°„ κ²½λ‘œκ°€ μ£Όμ–΄μ§€λŠ”λ°, 두 μ§‘ν•˜μž₯의 λ²ˆν˜Έμ™€ κ·Έ 사이λ₯Ό μ˜€κ°€λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ΄ μˆœμ„œλŒ€λ‘œ 주어진닀. μ§‘ν•˜μž₯의 λ²ˆν˜Έλ“€κ³Ό 경둜의 μ†Œμš”μ‹œκ°„μ€ λͺ¨λ‘ 1000μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.

 

πŸ“‘μΆœλ ₯

μ˜ˆμ‹œλœ 것과 같은 ν˜•μ‹μ˜ κ²½λ‘œν‘œλ₯Ό 좜λ ₯ν•œλ‹€.

 

πŸ“š λ¬Έμ œ ν’€μ΄

ν”Œλ‘œμ΄λ“œ μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ μ΅œλ‹¨κ²½λ‘œλ₯Ό κ°±μ‹ ν•  λ•Œ λ°©λ¬Έν•΄μ•Όν•  λ…Έλ“œμ˜ λ²ˆν˜Έλ„ 같이 κ°±μ‹ ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•˜μ˜€λ‹€.

 

일반적인 ν”Œλ‘œμ΄λ“œ μ›Œμ…œ κ΅¬ν˜„ μ½”λ“œμ— iμ—μ„œ j둜 κ°€λŠ” 것보닀 i -> x -> j, xλ₯Ό 거쳐 κ°€λŠ” 것이 λΉ λ₯Ό λ•Œ κ²½λ‘œλ„ route[i][j] = route[i][x] μ΄λ ‡κ²Œ μ„€μ •ν•΄μ€€λ‹€.

 

πŸ’» μ½”λ“œ

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
import sys
input = sys.stdin.readline
 
INF = int(1e9)
n,m = map(int,input().split())
graph = [[INF] * (n+1for _ in range(n+1)]
route = [[j for j in range(n+1)] for i in range(n+1)]
 
for _ in range(m):
    a,b,c = map(int,input().split())
    graph[a][b] = min(graph[a][b], c)
    graph[b][a] = min(graph[b][a], c)
 
for x in range(1, n+1):
    graph[x][x] = 0
    route[x][x] = "-"
    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]
 
for i in range(1, n+1):
    for j in range(1, n+1):
        print(route[i][j], end=' ')
    print()
cs

 

🍭 μ‹œν–‰μ°©μ˜€ 

리벀지 성곡이닀.

ν‹€λ Έλ˜ μ΄μœ λŠ” route[i][j] = route[i][x] 둜 μ„€μ •ν•œκ²Œ μ•„λ‹ˆλΌ, route[i][j] = x 둜 μ„€μ •ν•˜μ˜€λ‹€.

λ¬Έμ œλŠ” μ΅œλ‹¨κ²½λ‘œ 갱신될 λ•Œ 같이 κ²½λ‘œλ„ κ°±μ‹ λ˜μ§€ μ•ŠλŠ” κ²ƒμ΄μ˜€λ‹€.

μ΄κΈ€μ˜ 도움을 λ°›μ•„ ν•΄κ²°ν•˜μ˜€λ‹€.

 

πŸ”— 문제링크 택배

 

1719번: 택배

첫째 쀄에 두 수 nκ³Ό m이 빈 칸을 사이에 두고 μˆœμ„œλŒ€λ‘œ 주어진닀. n은 μ§‘ν•˜μž₯의 개수둜 200μ΄ν•˜μ˜ μžμ—°μˆ˜, m은 μ§‘ν•˜μž₯κ°„ 경둜의 개수둜 10000μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€. μ΄μ–΄μ„œ ν•œ 쀄에 ν•˜λ‚˜μ”© μ§‘ν•˜μž₯κ°„ κ²½

www.acmicpc.net