ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [λ°±μ€€] 1238 νŒŒν‹° with Python
    PS 2022. 6. 7. 04:55
    728x90
    λ°˜μ‘ν˜•

    πŸ“Œ BOJ 1238 νŒŒν‹°

    πŸ’‘ 쑰건

    1. N개의 숫자둜 κ΅¬λΆ„λœ 각각의 λ§ˆμ„μ— ν•œ λͺ…μ˜ 학생이 μ‚΄κ³  μžˆλ‹€.
    1. Nλͺ…μ˜ 학생이 X (1 ≀ X ≀ N)번 λ§ˆμ„μ— λͺ¨μ—¬μ„œ νŒŒν‹°λ₯Ό 벌이기둜 ν–ˆλ‹€.
      이 λ§ˆμ„ μ‚¬μ΄μ—λŠ” 총 M개의 단방ν–₯ λ„λ‘œλ“€μ΄ 있고 i번째 길을 μ§€λ‚˜λŠ”λ° Ti(1 ≀ Ti ≀ 100)의 μ‹œκ°„μ„ μ†ŒλΉ„ν•œλ‹€.
    1. 각각의 학생듀은 νŒŒν‹°μ— μ°Έμ„ν•˜κΈ° μœ„ν•΄ κ±Έμ–΄κ°€μ„œ λ‹€μ‹œ κ·Έλ“€μ˜ λ§ˆμ„λ‘œ λŒμ•„μ™€μ•Ό ν•œλ‹€.
      ν•˜μ§€λ§Œ 이 학생듀은 μ›Œλ‚™ κ²Œμ„λŸ¬μ„œ μ΅œλ‹¨ μ‹œκ°„μ— 였고 κ°€κΈ°λ₯Ό μ›ν•œλ‹€.
    1. 이 λ„λ‘œλ“€μ€ 단방ν–₯이기 λ•Œλ¬Έμ— μ•„λ§ˆ 그듀이 였고 κ°€λŠ” 길이 λ‹€λ₯Όμ§€λ„ λͺ¨λ₯Έλ‹€.
      Nλͺ…μ˜ 학생듀 쀑 였고 κ°€λŠ”λ° κ°€μž₯ λ§Žμ€ μ‹œκ°„μ„ μ†ŒλΉ„ν•˜λŠ” 학생은 λˆ„κ΅¬μΌμ§€ κ΅¬ν•˜μ—¬λΌ.
    1. N(1 ≀ N ≀ 1,000), M(1 ≀ M ≀ 10,000), Xκ°€ 곡백으둜 κ΅¬λΆ„λ˜μ–΄ μž…λ ₯λœλ‹€.
      μ‹œμž‘μ κ³Ό 끝점이 같은 λ„λ‘œλŠ” μ—†μœΌλ©°, μ‹œμž‘μ κ³Ό ν•œ λ„μ‹œ Aμ—μ„œ λ‹€λ₯Έ λ„μ‹œ B둜 κ°€λŠ” λ„λ‘œμ˜ κ°œμˆ˜λŠ” μ΅œλŒ€ 1κ°œμ΄λ‹€.
      λͺ¨λ“  학생듀은 μ§‘μ—μ„œ X에 갈수 있고, Xμ—μ„œ μ§‘μœΌλ‘œ λŒμ•„μ˜¬ 수 μžˆλŠ” λ°μ΄ν„°λ§Œ μž…λ ₯으둜 주어진닀.
    1. κ·Έλž˜ν”„νƒμƒ‰, λ‹€μ΅μŠ€νŠΈλΌ μœ ν˜•μ˜ 문제

    πŸ–₯ μ†ŒμŠ€ μ½”λ“œ

    from sys import stdin
    import heapq
    
    n, m, x = map(int, stdin.readline().split())
    graph = [[] for _ in range(n + 1)]
    ans = [0 for _ in range(n)]
    
    for _ in range(m):
        a, b, c = map(int, stdin.readline().split())
        graph[a].append((c, b))
    
    
    def solve(start):
        q = []
        heapq.heappush(q, (0, start))
        dist = [int(1e9) for _ in range(n + 1)]
        dist[start] = 0
    
        while q:
            cost, now = heapq.heappop(q)
    
            for d, next_pos in graph[now]:
                if dist[next_pos] > cost + d:
                    dist[next_pos] = cost + d
                    heapq.heappush(q, (cost + d, next_pos))
    
        return dist
    
    
    r = -1
    for i in range(1, n + 1):
        if i != x:
            go = solve(i)[x]
            goal = solve(x)[i]
            r = max(r, go + goal)
    
    print(r)

    πŸ”– 예제 및 μ‹€ν–‰κ²°κ³Ό

    예제

    4 8 2
    1 2 4
    1 3 2
    1 4 7
    2 1 1
    2 3 5
    3 1 2
    3 4 4
    4 2 3

    μ‹€ν–‰κ²°κ³Ό

    10

    ⌨️ 문제 풀이

    1. "μ΅œλ‹¨ μ‹œκ°„μ— 였고 κ°€κΈ°λ₯Ό μ›ν•œλ‹€." λΌλŠ” λŒ€λͺ©μ—μ„œ λ‹€μ΅μŠ€νŠΈλΌλ₯Ό 생각해볼 수 μžˆλ‹€.
      λ˜ν•œ λ¬Έμ œμ—μ„œ M개의 단방ν–₯ λ„λ‘œλ“€μ΄ μžˆλ‹€λŠ” 정보가 μžˆλ‹€.
    1. (1)번의 정보λ₯Ό 톡해 단방ν–₯ κ·Έλž˜ν”„μ—μ„œ μ΅œλ‹¨κ±°λ¦¬λ₯Ό 찾으면 λœλ‹€λŠ” 결둠이 λ‚˜μ˜¨λ‹€.
    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.