λͺ©μ°¨ (OPEN)
π λ¬Έμ
- λ°©ν₯ κ·Έλνκ° μκ³ , κ° κ°μ μλ ν΅νλ£ d μ νμ λΉμ© c κ° λΆμ΄ μλ€.
- μμμ s μμ λμ°©μ e λ‘ κ°λ μ΄ ν΅νλ£κ° x μ΄νμΈ λͺ¨λ κ²½λ‘μ ν¬ν¨λλ κ°μ μ μ λΆ νμνλ € νλ€.
- μ¬λ¬ μ§μ x μ λν΄μ νμν΄μΌ ν κ°μ λ€μ νμ λΉμ© ν©μ ꡬν΄μΌ νλ€.
π‘ μμ΄λμ΄
ν΅μ¬μ κ°μ λ¨μλ‘ κ·Έ κ°μ μ μ§λλ s -> e κ²½λ‘μ μ΅μ ν΅νλ €λ₯Ό ν λ²μ κ³μ°ν΄λλ κ²μ΄λ€.
μ΄ κ°μ 미리 μλ©΄ μ§μ xλ§λ€ μκ³κ° μ΄νμΈ κ°μ λ§ ν©μ°νλ©΄ λκΈ° λλ¬Έμ ν¨μ¨μ μ΄λ€.
- κ°μ λ§λ€ μ΅μ λΉμ© κ³μ°νκΈ°
λ§μ½ μ΄λ€ λλ‘ u -> v κ° μλ€κ³ ν΄λ³΄μ.
μ΄ λλ‘κ° μ€μ λ‘ s - > e κ²½λ‘μ ν¬ν¨λλ €λ©΄, μλμ 3κ°μ§ μμλ₯Ό λͺ¨λ λν΄μ€μΌ νλ€.
1) sμμ uκΉμ§ κ°λ μ΅λ¨ μκΈ
2) u -> v λλ‘μ μκΈ
3) vμμ eκΉμ§ κ°λ μ΅λ¨ μκΈ
ππ» μ¦, μμ μΈ κ°μ§λ₯Ό λν΄μ£Όλ©΄, ν΄λΉ λλ‘(u -> v)λ₯Ό κ±°μ³ s - > eλ‘ κ°λ λ° λλ μ΅μ μκΈμ μ μ μλ κ²μ΄λ€.
(μ½κ² λ§ν΄ λλ‘ νλλ§λ€ μ΄ λλ‘λ₯Ό κ±°μΉλ μ΅μ κ²½λ‘ μκΈμ 미리 μ μ΄λλ κ±°λΌκ³ μκ°νλ©΄ λλ€.) - μκ³κ° xμ λΉκ΅νκΈ°
μμμ κ³μ°ν κ°μ key(κ°μ )μ΄λΌ νκ³ , μ§μ xκ° λ€μ΄μ¨λ€κ³ νμ.
1) λ§μ½ key <= x μ΄λ©΄ ππ» μ΄ λλ‘λ μ΄λ€ κ²½λ‘μμλ μ΄ μκΈμ΄ x μ΄νμΌ κ°λ₯μ±μ΄ μμΌλ, νμ νλ³΄κ° λ¨
2) λ§μ½ key > x μ΄λ©΄ ππ» μ μ΄μ μ΄ λλ‘λ₯Ό μ§λλ μκ° λΉμ©μ΄ νμ μκ³κ° λ³΄λ€ μ»€μ§λ κ²μ΄λ―λ‘, νμλ μΌμ΄ μμ - μ¬λ¬ μ§μλ₯Ό λΉ λ₯΄κ² μ²λ¦¬νκΈ°
μ¬λ¬ κ°μ x κ°μ΄ λ€μ΄μ¬ μ μμΌλκΉ, λ§€λ² λͺ¨λ λλ‘λ₯Ό λ€ νμΈν΄μ£Όλ©΄ λ무 λ리λ€.
κ·Έλμ μ°λ¦¬λ 미리 μλμ μ€λΉλ€μ ν΄μ£Όμ΄μΌ νλ€.
1) λͺ¨λ λλ‘μ (key, νμ λΉμ©)μ μ μ΄λκ³ , keyλ₯Ό κΈ°μ€μΌλ‘ μ λ ¬νλ€.
2) νμ λΉμ©λ€μ μμμλΆν° μ°¨λ‘λλ‘ λν΄μ λμ ν©μ λ§λ€μ΄μ€λ€.
(ex. μμμλΆν° 3κ°μ λλ‘λ₯Ό ν©μΉλ©΄ λΉμ©μ΄ μΌλ§κ³ , 5κ°μ λλ‘λ₯Ό ν©μΉλ©΄ λΉμ©μ΄ μΌλ§κ³ .. μ΄λ° λλ)
3) μ΄μ μ§μ xκ° λ€μ΄μ€λ©΄, key <= x μΈ λλ‘κ° λͺ κ°μΈμ§λ§ μ΄λΆ νμλ‘ μ°Ύκ³ , κ·Έ κ°μκΉμ§μ λμ ν©μ λ΅μΌλ‘ λ°λ‘ κΊΌλ΄λ©΄ λλ€.
λ μ½κ² μ΄ν΄νκΈ° μν΄μ μμ λ€λ₯Έ μν©μ μκ°ν΄λ³΄μ.
λ§μ½ λ΄κ° μ§κΈ λ§νΈμ κ°μ μΌνμ νκ³ μλλ°,
κ° μνλ§λ€ 'μ΄κ±°λ μ΅μ keyμ μ΄μ μ¬μΌ ꡬ맀 κ°λ₯ν¨, νλ λΉ κ°κ²©μ costμ μ' μ΄λΌκ³ μ¨μλ€κ³ ν΄λ³΄μ.
λλ μ€λ μΌνμ λμ€λ©΄μ xμλ§ λ€κ³ μλ€κ³ νλ©΄,
key < = x μ΄νμΈ μνλ€ μ€μμλ§ μΌνμ ν μ μμ κ²μ΄λ€.
(μ΅μ xμ μ΄μ μ¬μΌ κ΅¬λ§€κ° κ°λ₯ν μνμ 골λΌμΌ λ΄κ° λμ λΌ μ μμΌλκΉ ..)
ꡬ체μ μΌλ‘λ, λ΄κ° μ€λ λ§μμ λ€κ³ μΌνμ νλ €κ³ λμλλ°,
λΌλ©΄μ ν λ΄μ§λΉ 5μ²μ(cost)μΈλ°, λ§μ(key) μ΄μ μ¬μΌ κ²°μ κ° κ°λ₯νλ€κ³ νκ³ ,
λ‘λ³Άμ΄λ ν λ΄μ§λΉ 8000(cost) μμΈλ°, λ§ μ€μ²μ(key) μ΄μ μ¬μΌ κ²°μ κ° κ°λ₯νλ€κ³ ν΄λ³΄μ.
κ·Έλ¬λ©΄ λ΄κ° κ°μ§ λμ λ§μ λΏμΈλ°,
λ‘λ³Άμ΄λ₯Ό μ¬λ €λ©΄ μ΅μ λ§ μ€μ²μμ΄ νμν κ±°λκΉ μ μ΄μ λ λ‘λ³Άμ΄λ₯Ό μ¬λκ² λΆκ°λ₯ν΄μ§λ€.
κ·Έλμ λ΄κ° keyλ₯Ό κΈ°μ€μΌλ‘ μ λ ¬μ ν΄μ€ κ²μ΄κ³ ,
ꡬ맀 κ°λ₯ν μ΅μ μκΈ 5μ²μ, μ΅μ μκΈ 8μ²μ, μ΅μ μκΈ λ§μ, μ΅μ μκΈ 3λ§μ , ... μ΄λ° λλμΌλ‘ μ λ ¬μ΄ λμλ€κ³ μΉλ©΄,
λ€λ₯Έ μλμ΄ μμ 'μ λ μ€λ xμ κΉμ§λ§ μΈλμ~' νμ λ, λ°λ‘ ꡬ맀 κ°λ₯ν μνλ€μ λλ΅ν μ μκ² λλ κ²μ΄λ€.
π©π»π» μ 체 μ½λ
from heapq import heappush, heappop
INF = 10**9
# λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦
# startλ μμ μ μ
# graphλ μΈμ 리μ€νΈ (graph[u] = (v, w))
# nμ μ μ μ κ°μ
def dijkstra(start, graph, n):
dist = [INF] * n # μ΅λ¨ 거리 λ°°μ΄
dist[start] = 0
pq = [(0, start)] # (거리, μ μ ) μ°μ μμ ν
while pq:
du, u = heappop(pq)
# μ΄λ―Έ λ μ§§μ μ΅λ¨ κ±°λ¦¬κ° κ°±μ λ κ²½μ°λ 건λλ°κΈ°
if du != dist[u]:
continue
# uμμ λκ° μ μλ λͺ¨λ κ°μ κ²μ¬νκΈ°
for v, w in graph[u]:
nd = du + w
if nd < dist[v]:
dist[v] = nd
heappush(pq, (nd, v))
return dist
def main():
# nμ μ μ μ, mμ κ°μ μ, sλ μμ μ μ , eλ λμ°© μ μ
n, m, s, e = map(int, input().split())
s -= 1
e -= 1
# μ λ°©ν₯ κ·Έλνμ μλ°©ν₯ κ·Έλν μ€λΉν΄λκΈ°
not_reverse = [[] for _ in range(n)] # s -> ... νμμ©
reverse = [[] for _ in range(n)] # ... -> e νμμ©
edge = [] # μλ³Έ κ°μ (u, v, d, c) μ μ₯μ©
# κ°μ μ
λ ₯ λ°κΈ°
for _ in range(m):
u, v, d, c = map(int, input().split())
u -= 1
v -= 1
# μ λ°©ν₯ u -> v (λΉμ© d)
not_reverse[u].append((v, d))
# μλ°©ν₯ v -> u (λΉμ© d)
reverse[v].append((u, d))
# μ°λλ³Έ κ°μ μ μ₯
edge.append((u, v, d, c))
# μ§μ μ
λ ₯
q = int(input())
qs = [int(input()) for _ in range(q)]
distS = dijkstra(s, not_reverse, n) # sμμ κ° μ μ κΉμ§μ μ΅λ¨ 거리
distE = dijkstra(e, reverse, n) # κ° μ μ μμ eκΉμ§μ μ΅λ¨ 거리
# κ° κ°μ λ³λ‘ "s->u + d + v->e" μ΅μ λΉμ©(key) κ³μ°
keys = [] # κ°μ μ μ΅μ κ²½λ‘ λΉμ©
costs = [] # κ°μ νμ λΉμ©
for u, v, d, c in edge:
# sμμ uκΉμ§, vμμ eκΉμ§ λλ¬ λΆκ°λ₯νλ©΄ 건λλ°κΈ°
if distS[u] == INF or distE[v] == INF:
continue
key = distS[u] + d + distE[v] # ν΄λΉ κ°μ μ μ§λλ μ΅μ κ²½λ‘ λΉμ©
keys.append(key)
costs.append(c)
# (key, cost) μ μ λ ¬ μ€λΉ
pairs = []
i = 0
while i < len(keys):
pairs.append((keys[i], costs[i]))
i += 1
# key κΈ°μ€ μ λ ¬
pairs.sort()
# keyμ λΉμ©λ§ λ°λ‘ λΆλ¦¬
sorted_keys = []
i = 0
while i < len(pairs):
sorted_keys.append(pairs[i][0])
i += 1
# λμ λΉμ© ν© λ°°μ΄
sums = [0]
accumulate = 0
i = 0
while i < len(pairs):
accumulate += pairs[i][1]
sums.append(accumulate)
i += 1
# upper bound: x μ΄νμ key κ°μ μ°ΎκΈ°
def upper(arr, x):
l = 0
h = len(arr)
while l < h:
mid = (l + h) // 2
if arr[mid] <= x:
l = mid + 1
else:
h = mid
return l
# κ° μ§μ μ²λ¦¬
ans = []
i = 0
while i < len(qs):
x = qs[i]
# key <= x μΈ κ°μ κ°μ ꡬνκΈ°
k = upper(sorted_keys, x)
# λμ ν©μμ ν΄λΉ ꡬκ°κΉμ§ λΉμ© ν© μΆλ ₯
ans.append(str(sums[k]))
i += 1
print("\n".join(ans))
if __name__ == "__main__":
main()
π κ²°λ‘
λ³΄ν΅ μμ μ¬λ Έλ 3λ² dp λ¬Έμ (λν λ§λ€κΈ°)λ₯Ό λ μ΄λ €μνλλ°,
λ μ€λλ§μ μ½ν λ₯Ό λ΄μ κ·Έλ°κ° μ΄ λ¬Έμ κ° λ μ€λ κ³ λ―Όλλ€ ..
(λ³κ±΄ μλμ§λ§ μ΄λ»κ² μ κ·Όνλμ§κ° κ°λ¬Όκ°λ¬Όν΄μ ..γ γ )
κ·Έλλ μ€λλ§μ λ¬Έμ λ₯Ό κ°μ λ¨μλ‘ μͺΌκ°μ, μ μ²λ¦¬λ‘ ꡬ쑰νν λ€,
ν¨μ¨μ μΌλ‘ μ§μλ₯Ό μ²λ¦¬νλ μ¬κ³ λ²μ λ μ¬λ €λ³΄λ λΏλ―νκΈ΄ νμ§λ§ λ¨Έλ¦¬κ° λ무 μν λ€ .. ^^ ..
μ κΉμ΄λΌλ μνν νλ©΄ λ¨Έλ¦¬κ° κΈκ²©νκ² κ΅³μ΄λ²λ¦°λ€λ κ²μ κΉ¨λ¬μμΌλ
μμΌλ‘λ μ½ν λ κΎΈμ€ν νμ΄μ ν¬μ€ν ν΄μΌκ² λ€. (κΌ !!!! ππ»ππ»ππ»ππ»)
'π» μ½ν > π Python' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| [μ½ν /Python] λν λ§λ€κΈ° (0) | 2025.09.26 |
|---|---|
| [μ½ν /Python] μμ μ (0) | 2025.09.26 |
| [μ½ν /Python] νμΈνΈμΉ (0) | 2025.09.26 |