๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋๋ฌํ๋ ๋ฐฉ๋ฒ
- 'ํ ์ง์ ์์ ๋ค๋ฅธ ํน์ ์ง์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด์ผ ํ๋ ๊ฒฝ์ฐ'
- '๋ชจ๋ ์ง์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ง์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋ชจ๋ ๊ตฌํด์ผ ํ๋ ๊ฒฝ์ฐ'
- ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ๋ ๋ณดํต ๊ทธ๋ํ๋ฅผ ์ด์ฉํด ํํ
ใด ๊ฐ ์ง์ ์ ๊ทธ๋ํ์์ '๋ ธ๋'๋ก ํํ๋๊ณ ,
ใด ์ง์ ๊ฐ ์ฐ๊ฒฐ๋ ๋๋ก๋ ๊ทธ๋ํ์์ '๊ฐ์ '์ผ๋ก ํํ๋๋ค.
๋ค์ต์คํธ๋ผ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
- ๊ทธ๋ํ์์ ์ฌ๋ฌ ๊ฐ์ ๋ ธ๋๊ฐ ์์ ๋, ํน์ ํ ๋ ธ๋์์ ์ถ๋ฐํ์ฌ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๊ฐ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด์ฃผ๋ ์๊ณ ๋ฆฌ์ฆ
- '์์ ๊ฐ์ '์ด ์์ ๋ ์ ์์ ์ผ๋ก ๋์
- ๋งค๋ฒ '๊ฐ์ฅ ๋น์ฉ์ด ์ ์ ๋ ธ๋'๋ฅผ ์ ํํด์ ์์์ ๊ณผ์ ์ ๋ฐ๋ณตํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ถ๋ฅ
- ์๊ณ ๋ฆฌ์ฆ
1) ์ถ๋ฐ ๋ ธ๋ ์ค์
2) ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ ์ด๊ธฐํ
3) ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋ ์ ํ
4) ํด๋น ๋ ธ๋๋ฅผ ๊ฑฐ์ณ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๋น์ฉ์ ๊ณ์ฐํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ ๊ฐฑ์
5) ์ ๊ณผ์ ์์ 3๋ฒ๊ณผ 4๋ฒ์ ๋ฐ๋ณต
๋ฐฉ๋ฒ1) ๊ฐ๋จํ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ (๊ตฌํํ๊ธฐ ์ฝ์ง๋ง ๋๋ฆฌ๊ฒ ๋์)
- ์ฒ์์ ๊ฐ ๋ ธ๋์ ๋ํ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๋ด๋ 1์ฐจ์ ๋ฆฌ์คํธ ์ ์ธ
- ๋จ๊ณ๋ง๋ค '๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค์์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ ํ'ํ๊ธฐ ์ํด
๋งค ๋จ๊ณ๋ง๋ค 1์ฐจ์ ๋ฆฌ์คํธ์ ๋ชจ๋ ์์๋ฅผ ํ์ธ(์์ฐจํ์)
- ์๊ฐ๋ณต์ก๋ O(V^2) (V๋ ๋ ธ๋์ ๊ฐ์)
# ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
# ๊ฐ๋จํ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ฝ๋
import sys
input = sys.stdin.readline # ๋ฐ์ดํฐ์ ์๊ฐ ๋ง๋ค๋ ๊ฐ์ ํ์ ์ฌ์ฉ
INF = int(1e9) # ๋ฌดํ์ ์๋ฏธํ๋ ๊ฐ์ผ๋ก 10์ต์ ์ค์
# ๋
ธ๋์ ๊ฐ์, ๊ฐ์ ์ ๊ฐ์ ์
๋ ฅ๋ฐ๊ธฐ
n, m = map(int, input().split())
# ์์ ๋
ธ๋ ๋ฒํธ๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
start = int(input())
# ๊ฐ ๋
ธ๋์ ์ฐ๊ฒฐ๋์ด ์๋ ๋
ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๋ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ
graph = [[] for i in range(n+1)]
# ๋ฐฉ๋ฌธํ ์ ์ด ์๋์ง ์ฒดํฌํ๋ ๋ชฉ์ ์ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ
visited = [False] * (n+1)
# ์ต๋จ ๊ฑฐ๋ฆฌ ํ
์ด๋ธ์ ๋ชจ๋ ๋ฌดํ์ผ๋ก ์ด๊ธฐํ
distance = [INF] * (n+1)
# ๋ชจ๋ ๊ฐ์ ์ ๋ณด ์
๋ ฅ๋ฐ๊ธฐ
for _ in range(m):
a, b, c = map(int, input().split())
# a๋ฒ ๋
ธ๋์์ b๋ฒ ๋
ธ๋๋ก ๊ฐ๋ ๋น์ฉ์ด c
graph[a].append((b, c))
# ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋ ์ค์์ ๊ฐ์ฅ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋
ธ๋์ ๋ฒํธ ๋ฐํ
def get_smallest_node():
min_value = INF
index = 0 # ๊ฐ์ฅ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋
ธ๋(์ธ๋ฑ์ค)
for i in range(1, n+1):
if distance[i] < min_value and not visited[i]:
min_value = distance[i]
index = i
return index
def dijkstra(start):
# ์์ ๋
ธ๋์ ๋ํด์ ์ด๊ธฐํ
distance[start] = 0
visited[start] = True
for j in graph[start]:
distance[j[0]] = j[1]
# ์์ ๋
ธ๋๋ฅผ ์ ์ธํ ์ ์ฒด n-1๊ฐ์ ๋
ธ๋์ ๋ํ ๋ฐ๋ณต
for i in range(n-1):
# ํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋
ธ๋๋ฅผ ๊บผ๋ด์ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
now = get_smallest_node()
visited[now] = True
# ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋
ธ๋๋ฅผ ํ์ธ
for j in graph[now]:
cost = distance[now] + j[1]
# ํ์ฌ ๋
ธ๋๋ฅผ ๊ฑฐ์ณ์ ๋ค๋ฅธ ๋
ธ๋๋ก ์ด๋ํ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง์ ๊ฒฝ์ฐ
if cost < distance[j[0]]:
distance[j[0]] = cost
# ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ํ
dijkstra(start)
# ๋ชจ๋ ๋
ธ๋๋ก ๊ฐ๊ธฐ ์ํ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅ
for i in range(1, n+1):
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ, ๋ฌดํ์ด๋ผ๊ณ ์ถ๋ ฅ
if distance[i] == INF:
print("INFINITY")
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ, ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅ
else:
print(distance[i])
๋ฐฉ๋ฒ2) ๊ฐ์ ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ (๊ตฌํํ๊ธฐ ์ด๋ ต์ง๋ง ๋น ๋ฅด๊ฒ ๋์)
- ํ ์๋ฃ๊ตฌ์กฐ ์ฌ์ฉ -> ํน์ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ์ ๋ํ ์ ๋ณด๋ฅผ ํ์ ๋ด์์ ์ฒ๋ฆฌ
ใด ํ: ์ฐ์ ์์ ํ๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉ - ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฅ ๋จผ์ ์ญ์
ใด ํ์ด์ฌ์์ PriorityQueue, heapq ์ฌ์ฉ ๊ฐ๋ฅ (์ผ๋ฐ์ ์ผ๋ก heapq๊ฐ ๋ ๋น ๋ฅด๊ฒ ๋์)
ใด ์ฐ์ ์์ ํ ๊ตฌํ๋ฐฉ์ - ๋ฆฌ์คํธ, ํ
ใด ๋ฆฌ์คํธ ์ฝ์ ์๊ฐ O(1), ์ญ์ ์๊ฐ O(N)
ใด ํ ์ฝ์ ์๊ฐ O(logN), ์ญ์ ์๊ฐ O(logN)
ใด ํ์ฌ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธ๋๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก๋ง ์ฐ์ ์์ ํ๋ฅผ ์ถ๊ฐ๋ก ์ด์ฉ
- ์๊ฐ๋ณต์ก๋ O(ElogV) (V๋ ๋ ธ๋์ ๊ฐ์, E๋ ๊ฐ์ ์ ๊ฐ์)
- ์์ ์ฝ๋์ ๋น๊ตํ์ ๋, get_smallest_node()๋ผ๋ ํจ์๋ฅผ ์์ฑํ ํ์๊ฐ ์๋ค๋ ํน์ง์ด ์๋ค.
- '์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋'๋ฅผ ์ ํํ๋ ๊ณผ์ ์ ๋ค์ต์คํธ๋ผ ์ต๋จ ๊ฒฝ๋ก ํจ์ ์์์ ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์์ผ๋ก ๋์ฒดํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
# ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
# ๊ฐ์ ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ฝ๋
import heapq
import sys
input = sys.stdin.readline
INF = int(1e9)
# ๋
ธ๋์ ๊ฐ์, ๊ฐ์ ์ ๊ฐ์ ์
๋ ฅ๋ฐ๊ธฐ
n, m = map(int, input().split())
# ์์ ๋
ธ๋ ๋ฒํธ๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
start = int(input())
# ๊ฐ ๋
ธ๋์ ์ฐ๊ฒฐ๋์ด ์๋ ๋
ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๋ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ
graph = [[] for i in range(n+1)]
# ์ต๋จ ๊ฑฐ๋ฆฌ ํ
์ด๋ธ์ ๋ชจ๋ ๋ฌดํ์ผ๋ก ์ด๊ธฐํ
distance = [INF] * (n+1)
# ๋ชจ๋ ๊ฐ์ ์ ๋ณด๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
for _ in range(m):
a, b, c = map(int, input().split())
# a๋ฒ ๋
ธ๋์์ b๋ฒ ๋
ธ๋๋ก ๊ฐ๋ ๋น์ฉ์ด c
graph[a].append((b, c))
def dijkstra(start):
q = []
# ์์ ๋
ธ๋๋ก ๊ฐ๊ธฐ ์ํ ์ต๋จ ๊ฒฝ๋ก๋ 0์ผ๋ก ์ค์ ํ์ฌ ํ์ ์ฝ์
heapq.heappush(q, (0, start))
distance[start] = 0
while q: # ํ๊ฐ ๋น์ด์์ง ์๋ค๋ฉด
# ๊ฐ์ฅ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋
ธ๋์ ๋ํ ์ ๋ณด ๊บผ๋ด๊ธฐ
dist, now = heapq.heappop(q)
# ํ์ฌ ๋
ธ๋๊ฐ ์ด๋ฏธ ์ฒ๋ฆฌ๋ ์ ์ด ์๋ ๋
ธ๋๋ผ๋ฉด ๋ฌด์
if distance[now] < dist:
continue
# ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ์ธ์ ํ ๋
ธ๋๋ค์ ํ์ธ
for i in graph[now]:
cost = dist + i[1]
# ํ์ฌ ๋
ธ๋๋ฅผ ๊ฑฐ์ณ์, ๋ค๋ฅธ ๋
ธ๋๋ก ์ด๋ํ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง์ ๊ฒฝ์ฐ
if cost < distance[i[0]]:
distance[i[0]] = cost
heapq.heappush(q, (cost, i[0]))
# ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ํ
dijkstra(start)
# ๋ชจ๋ ๋
ธ๋๋ก ๊ฐ๊ธฐ ์ํ ์ต๋จ ๊ฑฐ๋ฆฌ ์ถ๋ ฅ
for i in range(1, n+1):
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ, ๋ฌดํ์ด๋ผ๊ณ ์ถ๋ ฅ
if distance[i] == INF:
print("INFINITY")
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ, ๊ฑฐ๋ฆฌ ์ถ๋ ฅ
else:
print(distance[i])
ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ
- ๋ชจ๋ ์ง์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ง์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋ชจ๋ ๊ตฌํด์ผ ํ๋ ๊ฒฝ์ฐ
- ๋จ๊ณ๋ง๋ค '๊ฑฐ์ณ ๊ฐ๋ ๋ ธ๋'๋ฅผ ๊ธฐ์ค์ผ๋ก ์๊ณ ๋ฆฌ์ฆ์ ์ํํ๋ค. ํ์ง๋ง ๋งค๋ฒ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค์์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๋ ๋ ธ๋๋ฅผ ์ฐพ์ ํ์๊ฐ ์๋ค.
- ์๊ฐ๋ณต์ก๋ O(N^3)
ใด ๋ ธ๋์ ๊ฐ์๊ฐ N๊ฐ ์ผ ๋, N๋ฒ์ ๋จ๊ณ๋ฅผ ์ํ O(N)
ใด ๋ชจ๋ ๋ ธ๋์ ๋ํ์ฌ ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๋ก ๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ ์ ๋ณด๋ฅผ ๋ด๊ธฐ ์ํด 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ์ฒ๋ฆฌ O(N^2)
# ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
# ํ๋ก์ด๋ ์์
์์ฝ๋ฆฌ์ฆ ์ฝ๋
INF = int(1e9)
# ๋
ธ๋์ ๊ฐ์ ๋ฐ ๊ฐ์ ์ ๊ฐ์๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
n = int(input())
m = int(input())
# 2์ฐจ์ ๋ฆฌ์คํธ(๊ทธ๋ํ ํํ)๋ฅผ ๋ง๋ค๊ณ , ๋ชจ๋ ๊ฐ์ ๋ฌดํ์ผ๋ก ์ด๊ธฐํ
graph = [[INF] * (n+1) for _ in range(n+1)]
# ์๊ธฐ ์์ ์์ ์๊ธฐ ์์ ์ผ๋ก ๊ฐ๋ ๋น์ฉ์ 0์ผ๋ก ์ด๊ธฐํ
for a in range(1, n+1):
for b in range(1, n+1):
if a == b:
graph[a][b] = 0
# ๊ฐ ๊ฐ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์
๋ ฅ๋ฐ์ ๊ทธ ๊ฐ์ผ๋ก ์ด๊ธฐํ
for _ in range(m):
# a์์ b๋ก ๊ฐ๋ ๋น์ฉ์ c๋ก ์ค์
a, b, c = map(int, input().split())
graph[a][b] = c
# ์ ํ์์ ๋ฐ๋ผ ํ๋ก์ด๋ ์์
์๊ณ ๋ฆฌ์ฆ์ ์ํ
for k in range(1, n+1):
for a in range(1, n+1):
for b in range(1, n+1):
graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])
# ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ
for a in range(1, n+1):
for b in range(1, n+1):
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ, ๋ฌดํ์ด๋ผ๊ณ ์ถ๋ ฅ
if graph[a][b] == INF:
print("INFINITY", end=" ")
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ, ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅ
else:
print(graph[a][b], end=" ")
print()
์ค์ ๋ฌธ์ 1. ๋ฏธ๋ ๋์
- ๋ฐฉ๋ฌธ ํ๋งค์์ด 1๋ฒ ํ์ฌ์์ ์ถ๋ฐํ์ฌ K๋ฒ ํ์ฌ๋ฅผ ๋ฐฉ๋ฌธํ ๋ค์ X๋ฒ ํ์ฌ๋ก ๊ฐ๋ ์ต์ ์๊ฐ ๊ตฌํ๊ธฐ
์ฐ๊ฒฐ๋ 2๊ฐ์ ํ์ฌ๋ ์๋ฐฉํฅ์ผ๋ก ์ด๋ ๊ฐ๋ฅ
- ์ด ๋ฌธ์ ๋ ์ ํ์ ์ธ ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์ด๋ค.
- 1๋ฒ ๋ ธ๋~X~K๋ก ๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ = (1๋ฒ ๋ ธ๋~X ์ต๋จ๊ฑฐ๋ฆฌ) + (X~K ์ต๋จ๊ฑฐ๋ฆฌ)
# ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
# ์ค์ ๋ฌธ์ 1. ๋ฏธ๋ ๋์
INF = int(1e9) # ๋ฌดํ
n, m = map(int, input().split())
graph = [[INF] * (n+1) for _ in range(n+1)] # 2์ฐจ์ ๋ฆฌ์คํธ ๋ง๋ค๊ณ ๋ฌดํ์ผ๋ก ์ด๊ธฐํ
# ์๊ธฐ ์์ ์์ ์๊ธฐ ์์ ์ผ๋ก ๊ฐ๋ ๋น์ฉ์ 0์ผ๋ก ์ด๊ธฐํ
for a in range(1, n+1):
for b in range(1, n+1):
if a == b:
graph[a][b] = 0
# ๊ฐ ๊ฐ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์
๋ ฅ๋ฐ๊ณ , ์๋ก์๊ฒ ๊ฐ๋ ๋น์ฉ์ 1๋ก ์ค์
for _ in range(m):
a, b = map(int, input().split())
graph[a][b] = 1
graph[b][a] = 1
x, k = map(int, input().split())
# ํ๋ก์ด์ฆ ์์
์๊ณ ๋ฆฌ์ฆ ์ํ
for k in range(1, n+1):
for a in range(1, n+1):
for b in range(1, n+1):
graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])
dist = graph[1][k] + graph[k][x]
if dist >= INF:
print("-1")
else:
print(dist)
์ค์ ๋ฌธ์ 2. ์ ๋ณด
- X์์ Y๋ก์ ํต๋ก๊ฐ ์ค์น๋์ด ์๋ค๋ฉด ๋ฉ์์ง ์ ์ก ๊ฐ๋ฅ
- ๋ฉ์์ง ๋ณด๋ผ ๋๋ ์ผ์ ์๊ฐ ์์๋จ
- ๋ฉ์์ง๋ ๋์ C์์ ์ถ๋ฐํ์ฌ ๊ฐ ๋์ ์ฌ์ด์ ์ค์น๋ ํต๋ก๋ฅผ ๊ฑฐ์ณ ์ต๋ํ ๋ง์ด ํผ์ ธ๋๊ฐ ๊ฒ์ด๋ค.
- C์์ ๋ณด๋ธ ๋ฉ์์ง๋ฅผ ๋ฐ๊ฒ ๋๋ ๋์์ ์ด ๊ฐ์์ ๋์๋ค์ด ๋ชจ๋ ๋ฉ์์ง๋ฅผ ๋ฐ๋ ๋ฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ ๊ณ์ฐ
- ์ ๋ ฅ) ์ฒซ์งธ ์ค์ ๋์์ ๊ฐ์ N, ํต๋ก์ ๊ฐ์ M, ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ ์ ํ๋ ๋์ C
๋์งธ ~ M+1 ์ค์ ํต๋ก์ ๋ํ ์ ๋ณด X, Y, Z (X->Y ์๊ฐ C)
- ์ถ๋ ฅ) ๋์์ ์ด ๊ฐ์์ ์ด ์๊ฐ
# ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
# ์ค์ ๋ฌธ์ 2. ์ ๋ณด
import heapq
import sys
input = sys.stdin.readline
INF = int(1e9)
n, m, c = map(int, input().split())
graph = [[] for i in range(n+1)]
distance = [INF] * (n+1)
for _ in range(m):
x, y, z = map(int, input().split())
graph[x].append((y, z))
def dijkstra(c):
q = []
# ์์ ๋
ธ๋๋ก ๊ฐ๊ธฐ ์ํ ์ต๋จ ๊ฒฝ๋ก๋ 0์ผ๋ก ์ค์ ํ์ฌ ํ์ ์ฝ์
heapq.heappush(q, (0, c))
distance[c] = 0
while q: # ํ๊ฐ ๋น์ด์์ง ์๋ค๋ฉด
# ๊ฐ์ฅ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋
ธ๋์ ๋ํ ์ ๋ณด ๊บผ๋ด๊ธฐ
dist, now = heapq.heappop(q)
# ํ์ฌ ๋
ธ๋๊ฐ ์ด๋ฏธ ์ฒ๋ฆฌ๋ ์ ์ด ์๋ ๋
ธ๋๋ผ๋ฉด ๋ฌด์
if distance[now] < dist:
continue
# ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ์ธ์ ํ ๋
ธ๋๋ค์ ํ์ธ
for i in graph[now]:
cost = dist + i[1]
# ํ์ฌ ๋
ธ๋๋ฅผ ๊ฑฐ์ณ์, ๋ค๋ฅธ ๋
ธ๋๋ก ์ด๋ํ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง์ ๊ฒฝ์ฐ
if cost < distance[i[0]]:
distance[i[0]] = cost
heapq.heappush(q, (cost, i[0]))
# ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ํ
dijkstra(c)
count = 0
max_dist = 0
for d in distance:
if d != INF:
count += 1
max_dist = max(max_dist, d)
print(count-1, max_dist)
'๐ค > ์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํฌ ํฌ์ธํฐ (Two Pointers) (0) | 2023.06.13 |
---|---|
๊ทธ๋ํ ์ด๋ก (Graph) (0) | 2022.07.18 |
๋์ ๊ณํ๋ฒ (Dynamic Programming) (0) | 2022.03.21 |
์ด์ง ํ์ ์๊ณ ๋ฆฌ์ฆ (Binary Search Algorithm) (0) | 2022.02.10 |
์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ (Sorting Algorithm) (0) | 2022.02.04 |