DevYoon
[๋ฐฑ์ค] 11404. ํ๋ก์ด๋ (Python) ๋ณธ๋ฌธ
link ๐ https://www.acmicpc.net/problem/11404
๋ฌธ์
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๏ธโฃ ๋ค์ต์คํธ๋ผ(Dijkstra) ํ์ด
๋ฉ๋ชจ๋ฆฌ : 34348 KB / ์๊ฐ : 1116 ms
from sys import stdin
import heapq
city_cnt = int(stdin.readline())
bus_cnt = int(stdin.readline())
city = [[2e9]*city_cnt for _ in range(city_cnt)]
bus = {}
for _ in range(bus_cnt):
start, destination, cost = map(int, stdin.readline().split())
start, destination = start-1, destination-1
if start not in bus:
bus[start] = {}
if destination not in bus[start]:
bus[start][destination] = 2e9
# ์ต์๊ฐ ๊ฐฑ์
bus[start][destination] = min(bus[start][destination], cost)
def dijkstra(bus_num):
heap = []
heapq.heappush(heap, (bus_num, 0))
city[bus_num][bus_num] = 0
while heap:
now, now_cost = heapq.heappop(heap)
if now in bus:
for next_value in bus[now]:
next_cost = bus[now][next_value]
if city[bus_num][next_value] > now_cost + next_cost:
city[bus_num][next_value] = now_cost + next_cost
heapq.heappush(heap, (next_value, city[bus_num][next_value]))
for idx in range(city_cnt):
if idx in bus:
dijkstra(idx)
for i in range(city_cnt):
for j in range(city_cnt):
if city[i][j] == 2e9:
print(0, end=" ")
else:
print(city[i][j], end=" ")
print()
- ์ ๋ชฉ์์๋ถํฐ ํ๋ก์ด๋ ์์ ๋ฌธ์ ๋ผ๊ณ ์๋ ค์ฃผ๊ณ ์์์ง๋ง, ํ๋ก์ด๋ ์์ ์ ๋ํด ์ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์๊ณ ์๋ ๋ค์ต์คํธ๋ผ๋ก ๋จผ์ ํ์ด๋ณด์๋ค.
- ๋์ ๋๋ฆฌ๋ฅผ ํ์ฉํด A๋์์์ B๋์๋ก ๊ฐ๋ ๋น์ฉ์ ์ต์๊ฐ์ผ๋ก ๊ฐฑ์ ํด์ฃผ์๊ณ , 0๋ถํฐ N(์ฝ๋ ์ city_cnt)๊น์ง ๋๋ฉฐ ์ถ๋ฐ ๋์ ๋ชฉ๋ก(bus)์ ์ํ ๊ฒฝ์ฐ ๋ค์ต์คํธ๋ผ๋ฅผ ๋๋ ค์ฃผ์๋ค.
2๏ธโฃ ํ๋ก์ด๋ ์์ (Floyd-Warshall) ํ์ด
๋ฉ๋ชจ๋ฆฌ : 31256 KB / ์๊ฐ : 404 ms
import sys
city_cnt = int(sys.stdin.readline())
bus_cnt = int(sys.stdin.readline())
city = [[2e9]*city_cnt for _ in range(city_cnt)]
def make_myself_zero(cnt):
# ์๊ธฐ ์์ ์ผ๋ก ๊ฐ๋ ๊ฒฝ์ฐ๋ฅผ 0์ผ๋ก ๊ฐฑ์
for y in range(cnt):
city[y][y] = 0
def floyd_warshall(cnt):
# i๋ฒ์งธ ๋์๋ฅผ ๊ฒฝ์ ํ๋ ๊ฒฝ์ฐ
for i in range(cnt):
for j in range(cnt):
for k in range(cnt):
# j์์ k๋ก ๋ฐ๋ก ๊ฐ๋ ๊ฒ VS j -> i -> k ๋ก i๋ฅผ ๊ฒฝ์ ํ๋ ๊ฒ ๋น๊ต
city[j][k] = min(city[j][k], city[j][i] + city[i][k])
for _ in range(bus_cnt):
a, b, c = map(int, sys.stdin.readline().split())
# ์์ ๋์์ ๋์ฐฉ ๋์๋ฅผ ์ฐ๊ฒฐํ๋ ๋
ธ์ ์ค ์ต์ ๋น์ฉ
city[a-1][b-1] = min(city[a-1][b-1], c)
make_myself_zero(city_cnt)
floyd_warshall(city_cnt)
for y in range(city_cnt):
for x in range(city_cnt):
if city[y][x] < 2e9:
print(city[y][x], end=" ")
else:
print(0, end=" ")
print()
- ํ๋ก์ด๋ ์์ ์ ๋ํด ๊ณต๋ถํ ํ ํ์ดํด๋ณด์๋ค.
- A ๋์์์ A ๋์๋ฅผ ๊ฐ ๊ฒฝ์ฐ๋ฅผ 0์ผ๋ก ๊ฐฑ์ ํด์ค๋ค.
- A ๋์์์ B ๋์๋ฅผ ๊ฐ ๋, C ๋์๋ฅผ ๊ฒฝ์ ํ์ฌ ๊ฐ๋ ๊ฒฝ์ฐ๋ฅผ ์ผ์คfor๋ฌธ์ผ๋ก ๊ตฌํํ๋ค.
- ๋ค์ต์คํธ๋ผ์ ํ๋ก์ด๋ ์์ ์ ๋น๊ตํ๋ ์ฌ๋ฏธ๊ฐ ์๋ ๋ฌธ์ ์๋ค! ํ์คํ ๋ค์ต์คํธ๋ผ๋ณด๋ค ์ํํ๋ ์์ ์ด ์ ์ด์์ธ์ง ์๊ฐ์ด ์ฝ 1/3 ์ ๋๋ก ์ค์๋ค.