[๋ฐฑ์ค€] 1504 ํŠน์ •ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ (python ํŒŒ์ด์ฌ)

2022. 7. 28. 04:29ยท๐Ÿงฉ Problem Solving/[๋ฐฑ์ค€]

https://www.acmicpc.net/problem/1504

 

1504๋ฒˆ: ํŠน์ •ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ

์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ N๊ณผ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ E๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ E๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ์„œ ์„ธ ๊ฐœ์˜ ์ •์ˆ˜ a, b, c๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ, a๋ฒˆ ์ •์ ์—์„œ b๋ฒˆ ์ •์ ๊นŒ์ง€ ์–‘๋ฐฉํ–ฅ ๊ธธ์ด ์กด

www.acmicpc.net


์•„์ด๋””์–ด

1. ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋Š” ๊ทธ๋ž˜ํ”„

  • ๋‹ค์ต์ŠคํŠธ๋ผ ์•„๋‹ˆ๋ฉด ํ”Œ๋กœ์ด๋“œ ๋‘ ๊ฐœ๋ฅผ ์ƒ๊ฐํ–ˆ๋‹ค.
  • ๋‘์ •์  v1, v2๋ฅผ ์ง€๋‚˜๋Š” ์ตœ๋‹จ๊ฒฝ๋กœ๋Š” ๊ฐ๊ฐ์˜ ์ตœ๋‹จ๊ฒฝ๋กœ๋“ค์„ ๋”ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์œผ๋ฏ€๋กœ ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
  • '1 -> N' = '1 -> v1' + 'v1 -> v2' + 'v2 ->N' ๊ฐ™์ด ๊ณ„์‚ฐํ•ด์„œ ๋‘ ์ •์ ์„ ์ง€๋‚˜๋Š” ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•œ๋‹ค.
  • ๋ฃจํŠธ๋Š” 1 -> v1 -> v2 -> N, 1 -> v2 -> v1 -> N  ๋‘ ๊ฐ€์ง€๋ฅผ ๊ณ„์‚ฐํ•ด ๋น„๊ตํ•˜๋ฉด ์ž‘์€ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

 


์ „์ฒด ์ฝ”๋“œ

import sys, heapq
INF = int(1e9)

N, E = map(int,input().split())

graph = [[] for _ in range(N + 1)]

for _ in range(E):
    a, b, c = map(int,sys.stdin.readline().rstrip().split())

    graph[a].append([b, c])
    graph[b].append([a, c])

v1, v2 = map(int,input().split())

def dijkstra(start):
    que = []
    heapq.heappush(que, (0, start))
    D[start] = 0

    while que:
        dist, now = heapq.heappop(que)
        if D[now] < dist:
            continue

        for i in graph[now]:
            cost = dist + i[1]
            if cost < D[i[0]]:
                D[i[0]] = cost
                heapq.heappush(que, (cost,i[0]))

root_A, root_B = 0, 0

D = [INF] * (N + 1)
dijkstra(1) # 1 -> v1, 1 -> v2
root_A += D[v1]
root_B += D[v2]

D = [INF] * (N + 1)
dijkstra(v1) # v1 -> v2, v1 -> N
root_A += D[v2]
root_B += D[N]

D = [INF] * (N + 1)
dijkstra(v2) # v2 -> N, v2 -> v1
root_A += D[N]
root_B += D[v1]

ans = min(root_A, root_B)

if ans >= INF:
    print(-1)
else:
    print(ans)

์ฝ”๋“œ ์„ค๋ช…

import sys, heapq
INF = int(1e9)

N, E = map(int,input().split())

graph = [[] for _ in range(N + 1)]

for _ in range(E):
    a, b, c = map(int,sys.stdin.readline().rstrip().split())

    graph[a].append([b, c])
    graph[b].append([a, c])

v1, v2 = map(int,input().split())

๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋Š” ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ์ž…๋ ฅ๋ฐ›์•„์ค€๋‹ค.

 

def dijkstra(start):
    que = []
    heapq.heappush(que, (0, start))
    D[start] = 0

    while que:
        dist, now = heapq.heappop(que)
        if D[now] < dist:
            continue

        for i in graph[now]:
            cost = dist + i[1]
            if cost < D[i[0]]:
                D[i[0]] = cost
                heapq.heappush(que, (cost,i[0]))

๋ฐ์ดํฌ์ŠคํŠธ๋ผ ์ฝ”๋“œ๋Š” ํž™์„ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ–ˆ๋‹ค. 

๋ฐ์ดํฌ์ŠคํŠธ๋ผ์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ๋„˜์–ด๊ฐ€๊ฒ ๋‹ค.

ํ•„์š”ํ•œ ๋ถ„๋“ค์€ ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰์„ ์‚ฌ์šฉํ•ด์ฃผ์„ธ์š”.

 

root_A, root_B = 0, 0

D = [INF] * (N + 1)
dijkstra(1) # 1 -> v1, 1 -> v2
root_A += D[v1]
root_B += D[v2]

D = [INF] * (N + 1)
dijkstra(v1) # v1 -> v2, v1 -> N
root_A += D[v2]
root_B += D[N]

D = [INF] * (N + 1)
dijkstra(v2) # v2 -> N, v2 -> v1
root_A += D[N]
root_B += D[v1]

ans = min(root_A, root_B)

if ans >= INF:
    print(-1)
else:
    print(ans)

๋ฌธ์ œ์—์„œ ๋‘ ์ •์ ์„ ์ง€๋‚˜๊ฐ€๋Š” ๋ฐฉ๋ฒ•์€ 

1 -> v1 -> v2 -> N, 1 -> v2 -> v1 -> N(root_A, root_B) ์ด๋ ‡๊ฒŒ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

ํ•œ ๋ฒˆ์— ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ ์ •์ ๊ณผ ์ •์  ์‚ฌ์ด ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๊ฐ ๊ตฌํ•ด ๋”ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.

 

๋ฌธ์ œ์—์„œ ์ด๋ฏธ ์ด๋™ํ–ˆ๋˜ ์ •์ ์ด๋‚˜ ๊ฐ„์„ ์œผ๋กœ ๋‹ค์‹œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋‚˜์™€์žˆ์œผ๋ฏ€๋กœ

๋ฐ์ดํฌ์ŠคํŠธ๋ผ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์จ์„œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด๋„ ๊ดœ์ฐฎ๋‹ค.

 

๊ทธ๋ž˜์„œ ์ •์  1, v1, v2 ์ด 3๋ฒˆ ๋ฐ์ดํฌ์ŠคํŠธ๋ผ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์„œ root_A์™€ root_B ๊ฐ’์— ๋”ํ•ด์ค€๋‹ค.

์ดํ›„ root_A์™€ root_B ๋‘ ๊ฐ’ ์ค‘ ์ž‘์€ ๊ฐ’์„ ans ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค.

 

๋ฌธ์ œ์—์„œ ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋Š” -1์„ ์ถœ๋ ฅํ•˜๋ผ๊ณ  ๋‚˜์™€์žˆ๋‹ค.

๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋‹ค๋Š” ์–˜๊ธฐ๋Š” ans์— INF๊ฐ’์ด ๋”ํ•ด์กŒ๋‹ค๋Š” ์–˜๊ธฐ๋‹ค.

์™œ๋ƒ INF๊ฐ’์ด ๋”ํ•ด์กŒ๋‹ค๋Š” ๊ฑด ์–ด๋–ค ๋…ธ๋“œ์™€ ๋…ธ๋“œ ์‚ฌ์ด๊ฐ€ ์ด์–ด์ ธ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฑธ ๋œปํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ans๊ฐ€ INF๋ณด๋‹ค ํฌ๋ฉด -1์„ ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ans๊ฐ’์„ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ €์ž‘์žํ‘œ์‹œ

'๐Ÿงฉ Problem Solving > [๋ฐฑ์ค€]' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[๋ฐฑ์ค€] 9466 ํ…€ ํ”„๋กœ์ ํŠธ (python ํŒŒ์ด์ฌ)  (0) 2022.07.31
[๋ฐฑ์ค€] 1806 ๋ถ€๋ถ„ํ•ฉ (python ํŒŒ์ด์ฌ)  (0) 2022.07.29
[๋ฐฑ์ค€] 12100 2048(easy) (python ํŒŒ์ด์ฌ)  (0) 2022.07.25
[๋ฐฑ์ค€] 15654 N๊ณผ M(5) (python ํŒŒ์ด์ฌ)  (0) 2022.07.13
[๋ฐฑ์ค€] 1202 ๋ณด์„ ๋„๋‘‘ (python ํŒŒ์ด์ฌ)  (0) 2022.07.11
'๐Ÿงฉ Problem Solving/[๋ฐฑ์ค€]' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [๋ฐฑ์ค€] 9466 ํ…€ ํ”„๋กœ์ ํŠธ (python ํŒŒ์ด์ฌ)
  • [๋ฐฑ์ค€] 1806 ๋ถ€๋ถ„ํ•ฉ (python ํŒŒ์ด์ฌ)
  • [๋ฐฑ์ค€] 12100 2048(easy) (python ํŒŒ์ด์ฌ)
  • [๋ฐฑ์ค€] 15654 N๊ณผ M(5) (python ํŒŒ์ด์ฌ)
์ œ๋ด‰์•„
์ œ๋ด‰์•„
  • ์ œ๋ด‰์•„
    Overthinking
    ์ œ๋ด‰์•„
    fake it till you make it.
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (106)
      • ๐Ÿงฉ Problem Solving (83)
        • [๋ฐฑ์ค€] (74)
        • [ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] (7)
        • [SW Expert Academy] (1)
        • [์•Œ๊ณ ๋ฆฌ์ฆ˜ for PS] (1)
      • ๐Ÿ“ฆ Data Structure (2)
      • ๐Ÿ“œ Language (14)
        • [python] (14)
      • ๐Ÿ–ค Git (1)
      • ๐ŸŒ† ์ผ์ƒ (4)
        • ๐Ÿ’ฌ ๋ฒฝ๋ณด๊ณ  ๋งํ•˜๊ธฐ (4)
      • ๐Ÿ—„๏ธ ๊ธฐํƒ€ (2)
      • ๐Ÿ”ต css (0)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ๋ฐ๋ธŒ์ฝ”์Šค
    ๋ถ€๋ถ„ํ•ฉ
    ๋ฐฑ์ค€
    ํŒŒ์ด์ฌ
    DP
    ์Šคํƒ
    boj
    BFS
    Bruteforce
    ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ
    ๋ฐฑํŠธ๋ž˜ํ‚น
    ํ”Œ๋กœ์ด๋“œ์›Œ์…œ
    slicing
    ๋ˆ„์ ํ•ฉ
    DFS
    ์ •์ฒ˜๊ธฐ
    ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
    SWEA
    ๋ธŒ๋ฃจํŠธํฌ์Šค
    ์œ„์ƒ์ •๋ ฌ
    ๋ถ„ํ•  ์ •๋ณต
    ๋ƒ…์ƒ‰
    ๊ทธ๋ฆฌ๋””
    imos
    Python
    ํŒฐ๋ฆฐ๋“œ๋กฌ
    ์žฌ๊ท€
    ํˆฌํฌ์ธํ„ฐ
    ๊ตฌํ˜„
    ๋‹ค์ต์ŠคํŠธ๋ผ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
์ œ๋ด‰์•„
[๋ฐฑ์ค€] 1504 ํŠน์ •ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ (python ํŒŒ์ด์ฌ)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”