πλ¬Έμ νμνκΈ°
- N(1≤ N ≤ 1,000)μ μ»΄ν¨ν°λ‘ ꡬμ±λ λ€νΈμν¬
- μ»΄ν¨ν° μ€ λͺ κ°λ μλ‘ λ€νΈμν¬ μ°κ²°μ΄ λμ΄μμ΄ ν΅μ κ°λ₯ (μλ°©ν₯ ν΅μ )
- μ§μ μ°κ²°λμ΄ μλ νμ νΉμ μ°κ²°λ λ€λ₯Έ μ»΄ν¨ν°λ₯Ό κ±°μ³μ ν΅μ κ°λ₯
- κ° μ»΄ν¨ν°μ νμ μ μ±λ₯μ΄ μ°¨μ΄κ° λ¨
- μ§μ μ°κ²°λμ΄ μλ νμ μ μ¬μ©ν κ²½μ° ν΄λΉ νμ μ μ΄μ©ν΄ ν΅μ νλ μκ° λ§νΌ μμ
- μ¬λ¬ κ°μ νμ μ κ±°μΉλ κ²½μ° κ° νμ μ μ΄μ©ν΄ ν΅μ νλ μκ°μ ν©λ§νΌ μμ
- ν΄μ»€κ° λ€νΈμν¬μ μΉ¨μ
νμ¬, 보μ μμ€ν
μ λ¨ ν κ°μ μνΌμ»΄ν¨ν°, 1λ² μ»΄ν¨ν°μλ§ μ€μΉνκ³ μ ν¨
- μλ‘ λ€λ₯Έ λ μ»΄ν¨ν° κ°μ ν΅μ μ΄ κ°λ₯νλ, μ΅μ κ°μμ νμ λ§μ 볡ꡬ
- μνΌμ»΄ν¨ν°κ° λ€λ₯Έ μ»΄ν¨ν°λ€κ³Ό ν΅μ νλ λ° κ±Έλ¦¬λ μ΅μ μκ°μ΄ μλμ λ€νΈμν¬μμ ν΅μ νλλ° κ±Έλ¦¬λ μ΅μ μκ°λ³΄λ€ 컀μ§λ©΄ μλ¨
- 쑰건μ λ§μ‘±νλ©΄μ λ€νΈμν¬λ₯Ό 볡ꡬνλ λ°©λ²μ μμλ΄, κ·Έ μ€ ν κ°μ§ λ°©λ²μ λν΄ μλ λ΄μ© ꡬνκΈ°
- 볡ꡬν νμ μ κ°μ
- 볡ꡬν νμ μ΄ μ°κ²°νλ μ»΄ν¨ν°λ€
ν΄λΉ λ¬Έμ λ κ° μ»΄ν¨ν°λ€μ μ μ , κ·Έλ¦¬κ³ λ μ»΄ν¨ν°λ₯Ό μ°κ²°νλ νμ μ λ Έλ, ν΅μ μ 걸리λ μκ°μ λΉμ©μΌλ‘ μκ°νλ©΄ μμ κ°μ€μΉκ° μλ μλ°©ν₯ κ·Έλνλ‘ ννν μ μλ€.
μ¬κΈ°μ λ¬Έμ λ 'μ΄λ»κ² μ΅μ κ°μμ νμ λ§μ μ¬μ©ν΄μ 1λ² μ»΄ν¨ν°μ λ€λ₯Έ λͺ¨λ μ»΄ν¨ν°λ₯Ό μ°κ²°ν μ μμκΉ?'λ€. λ¬Έμ 쑰건μ μν΄μ μνΌ μ»΄ν¨ν°κ° λ€λ₯Έ μ»΄ν¨ν°λ€κ³Ό ν΅μ νλ λ° κ±Έλ¦¬λ μ΅μ μκ°μ΄ μλμ λ€νΈμν¬μμ ν΅μ νλ λ° κ±Έλ¦¬λ μ΅μ μκ°λ³΄λ€ 컀μ§λ©΄ μλλ€κ³ νμΌλ―λ‘ μλμ λ€νΈμν¬μμ (1λ² μ»΄ν¨ν° - λ€λ₯Έ μ»΄ν¨ν°)κ° ν΅μ νλ κ°μ₯ λΉ λ₯Έ λ°©λ²μ κ²½λ‘(νμν νμ λ€)λ₯Ό ꡬν΄μ μ€λ³΅μ μ κ±°νλ©΄ λ κ²μ΄λΌκ³ μκ°νλ€.
μ¦, κ·Έλνμ νΉμ μ μ μμλΆν° μμν΄μ λ€λ₯Έ μ μ κΉμ§ μ΅μ λΉμ©μΌλ‘ λλ¬νλ κ²½λ‘λ₯Ό ꡬνλ λ¬Έμ μ΄λ―λ‘ λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ ν΄κ²°ν μ μλ€.
πμ½λ μ€κ³νκΈ°
- λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μ ꡬνν ν¨μ dijkstar(graph, start)λ₯Ό μ μνλ€.
- 1λ² μ»΄ν¨ν°μμ κ° μ»΄ν¨ν°κΉμ§μ μ΅λ¨ μκ°μ μ μ₯ν distancesμ λΆλͺ¨ λ Έλλ₯Ό μ μ₯ν parentsλ₯Ό μμ±νκ³ , startλ²μ§Έ μμμ κ°μ 0μΌλ‘, distancesμ λλ¨Έμ§ μμλ€μ 무νλ(INF)λ‘ μ΄κΈ°ννλ€.
- μμ§ λ°©λΆνμ§ μμ μ μ μ€μμ νμ¬κΉμ§ κ³μ°λ μ΅λ¨ κ±°λ¦¬κ° κ°μ₯ μμ μ μ μ ꡬνκΈ° μν΄ μ°μ μμν hqλ₯Ό μμ±νκ³ (0, start)λ₯Ό νμ μ½μ νλ€.
- hqμ κ°μ΄ μ‘΄μ¬νλ λμ, hqμμ κ°μ κΊΌλ΄μ, ν΄λΉ μ μ κ³Ό μ°κ²°λ λ€λ₯Έ μ μ μ νμνλ©° μ΅μ λΉμ© ν μ΄λΈ distancesμ λΆλͺ¨ λ Έλ 리μ€νΈ parentsλ₯Ό κ°±μ νλ€.
- μ΅μ λΉμ© ν μ΄λΈμ κ°±μ μ΄ μ’ λ£λ ν, parentsλ₯Ό λ°ννλ€.
- μ»΄ν¨ν°μ κ°μ N, νμ μ κ°μ Mμ μ λ ₯λ°λλ€.
- μ»΄ν¨ν°μ μ°κ²° μ 보λ₯Ό μ μ₯ν κ·Έλν networkλ₯Ό μμ±νκ³ , νμ μ μ 보λ₯Ό μ λ ₯λ°μ μ μ₯νλ€.
- dijkstra(network, 1)μ μ€ννμ¬ κ° λ Έλμ λΆλͺ¨λ Έλλ₯Ό κ΅¬ν΄ parentsμ μ μ₯νλ€.
- νμν νμ κ°μ(N-1)κ³Ό parents 리μ€νΈλ₯Ό λ°νμΌλ‘ νμν νμ μ λͺ©λ‘μ μΆλ ₯νλ€.
πμλ νμ°¨ μμ μ¬ν
1νμ°¨
μ λ΅μ λ°μμ§λ§, μλ μμ±ν μ½λμμ μ΅λ¨ κ²½λ‘μ κ°μ μ ꡬνλ λΆλΆμμ μ’ λ κ°λ¨ν λ‘μ§μ΄ μμ΄ ν΄λΉ λΆλΆμ μμ νλ€.
μλ μμ±ν μ½λλ dijkstra ν¨μ λ΄μμ ways 리μ€νΈλ₯Ό μ¬μ©ν΄μ μμ λ ΈλλΆν° κ° λ ΈλκΉμ§μ μ΅λ¨ κ²½λ‘ κ·Έ μ체λ₯Ό μ μ₯νλ€. νμ§λ§ κ° λ Έλμ λΆλͺ¨ λ Έλλ§ μ μ₯νλ©΄ μ΅λ¨ κ²½λ‘λ₯Ό 볡μν μ μμ λΏλ§ μλλΌ, λ¬Έμ μμ νμν κ²μ μ΅λ¨ κ²½λ‘μ μ¬μ©λλ κ°μ μ λͺ©λ‘μ΄μκΈ° λλ¬Έμ λΆλͺ¨ λ Έλλ₯Ό μ μ₯νλλ‘ λ°κΏμ μ½λλ₯Ό κ°κ²°νκ² λ§λ€μλ€.
κΈ°μ‘΄ μ½λ
from heapq import heappush, heappop
import sys
input = sys.stdin.readline
def dijkstra(graph, start):
hq = [(0, 1)]
distances = [float('INF')]*(N+1)
distances[start] = 0
ways = [[] for _ in range(N+1)]
while hq:
cur_cost, cur_node = heappop(hq)
if cur_cost > distances[cur_node]:
continue
for next_node, next_cost in graph[cur_node]:
new_cost = distances[cur_node] + next_cost
if new_cost < distances[next_node]:
distances[next_node] = new_cost
ways[next_node] = ways[cur_node] + [(cur_node,next_node)]
heappush(hq, (new_cost, next_node))
return ways
N, M = map(int, input().split())
network = [[] for _ in range(N+1)]
for _ in range(M):
a, b, c = map(int, input().split())
network[a].append((b, c))
network[b].append((a, c))
ways = dijkstra(network, 1)
lines = set()
for way in ways:
for line in way:
lines.add(line)
print(len(lines))
for a, b in lines:
print(a, b)
πμ λ΅ μ½λ
from heapq import heappush, heappop
import sys
input = sys.stdin.readline
def dijkstra(graph, start):
hq = [(0, 1)]
distances = [float('INF')]*(N+1)
distances[start] = 0
parents = [0]*(N+1)
while hq:
cur_cost, cur_node = heappop(hq)
if cur_cost > distances[cur_node]:
continue
for next_node, next_cost in graph[cur_node]:
new_cost = distances[cur_node] + next_cost
if new_cost < distances[next_node]:
distances[next_node] = new_cost
parents[next_node] = cur_node
heappush(hq, (new_cost, next_node))
return parents
N, M = map(int, input().split())
network = [[] for _ in range(N+1)]
for _ in range(M):
a, b, c = map(int, input().split())
network[a].append((b, c))
network[b].append((a, c))
parents = dijkstra(network, 1)
print(N-1)
for i in range(2, N+1):
print(i, parents[i])