[BOJ] 11404번 | ν”Œλ‘œμ΄λ“œ (Python3)

2022. 9. 15. 14:17ㆍCoding Test/BOJ

πŸ”—λ¬Έμ œ λ³΄λŸ¬κ°€κΈ°
 

11404번: ν”Œλ‘œμ΄λ“œ

첫째 쀄에 λ„μ‹œμ˜ 개수 n이 주어지고 λ‘˜μ§Έ μ€„μ—λŠ” λ²„μŠ€μ˜ 개수 m이 주어진닀. 그리고 μ…‹μ§Έ 쀄뢀터 m+2μ€„κΉŒμ§€ λ‹€μŒκ³Ό 같은 λ²„μŠ€μ˜ 정보가 주어진닀. λ¨Όμ € μ²˜μŒμ—λŠ” κ·Έ λ²„μŠ€μ˜ 좜발 λ„μ‹œμ˜ λ²ˆν˜Έκ°€

www.acmicpc.net

 

 

문제 μ„€λͺ…

n(2 ≤ n ≤ 100)개의 λ„μ‹œκ°€ μžˆλ‹€. 그리고 ν•œ λ„μ‹œμ—μ„œ μΆœλ°œν•˜μ—¬ λ‹€λ₯Έ λ„μ‹œμ— λ„μ°©ν•˜λŠ” m(1 ≤ m ≤ 100,000)개의 λ²„μŠ€κ°€ μžˆλ‹€. 각 λ²„μŠ€λŠ” ν•œ 번 μ‚¬μš©ν•  λ•Œ ν•„μš”ν•œ λΉ„μš©μ΄ μžˆλ‹€. λͺ¨λ“  λ„μ‹œμ˜ 쌍 (A, B)에 λŒ€ν•΄μ„œ λ„μ‹œ Aμ—μ„œ B둜 κ°€λŠ”λ° ν•„μš”ν•œ λΉ„μš©μ˜ μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 


μž…λ ₯

첫째 μ€„에 λ„μ‹œμ˜ κ°œμˆ˜ n이 μ£Όμ–΄μ§€κ³  λ‘˜μ§Έ μ€„μ—λŠ” λ²„μŠ€μ˜ κ°œμˆ˜ m이 μ£Όμ–΄μ§„λ‹€. κ·Έλ¦¬κ³  μ…‹μ§Έ μ€„λΆ€ν„° m+2μ€„κΉŒμ§€ λ‹€μŒκ³Ό κ°™μ€ λ²„μŠ€μ˜ μ •λ³΄κ°€ μ£Όμ–΄μ§„λ‹€. λ¨Όμ € μ²˜μŒμ—λŠ” κ·Έ λ²„μŠ€μ˜ μΆœλ°œ λ„μ‹œμ˜ λ²ˆν˜Έκ°€ μ£Όμ–΄μ§„λ‹€. λ²„μŠ€μ˜ μ •λ³΄λŠ” λ²„μŠ€μ˜ μ‹œμž‘ λ„μ‹œ a, λ„μ°© λ„μ‹œ b, ν•œ λ²ˆ νƒ€λŠ”데 ν•„μš”ν•œ λΉ„μš© c둜 μ΄λ£¨μ–΄μ Έ μžˆλ‹€. μ‹œμž‘ λ„μ‹œμ™€ λ„μ°© λ„μ‹œκ°€ κ°™μ€ κ²½μš°λŠ” μ—†λ‹€. λΉ„μš©μ€ 100,000보닀 μž‘κ±°λ‚˜ κ°™μ€ μžμ—°μˆ˜μ΄λ‹€.

μ‹œμž‘ λ„μ‹œμ™€ λ„μ°© λ„μ‹œλ₯Ό μ—°κ²°ν•˜λŠ” λ…Έμ„ μ€ ν•˜λ‚˜κ°€ μ•„닐 μˆ˜ μžˆλ‹€.

 


좜λ ₯

n개의 μ€„을 μΆœλ ₯ν•΄μ•Ό ν•œλ‹€. i번째 μ€„에 μΆœλ ₯ν•˜λŠ” j번째 μˆ«μžλŠ” λ„μ‹œ iμ—μ„œ j둜 κ°€λŠ”데 ν•„μš”ν•œ μ΅œμ†Œ λΉ„μš©μ΄λ‹€. λ§Œμ•½, iμ—μ„œ j둜 κ°ˆ μˆ˜ μ—†λŠ” κ²½μš°μ—λŠ” κ·Έ μžλ¦¬μ— 0을 μΆœλ ₯ν•œλ‹€.

 


예제 μž…μΆœλ ₯

 


풀이 μ „λž΅

μ‹œμž‘ λ„μ‹œ A  →  λ„μ°© λ„μ‹œ B둜 κ°€λŠ” 노선이 μ—¬λŸ¬ 개일 μˆ˜λ„ μžˆλ‹€λŠ” 뢀뢄을 λͺ» λ΄μ„œ ν‹€λ Έμ—ˆλ„€μš”.
Floyd-Warshall μ•Œκ³ λ¦¬μ¦˜μ„ μ“°λŠ” λ¬Έμ œλ”κ΅°μš”. ν•™κ΅ μ•Œκ³ λ¦¬μ¦˜ μˆ˜μ—… μ‹œκ°„에 ν•œ λ²ˆ λ“€μ—ˆλ˜ κ²ƒ κ°™μ€λ° κΈ°μ–΅μ΄ μ•ˆ λ‚˜μ„œ λ‹€μ‹œ μ‚΄νŽ΄λ΄€μ—ˆμŠ΅λ‹ˆλ‹€. μž˜ μ •λ¦¬ν•΄λ†“μœΌμ‹  κΈ€μ΄ μžˆμ–΄μ„œ λ‹€ν–‰μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

제 ν’€μ΄κ³Όμ • μˆœμ„œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • ꡉμž₯히 큰 수둜 이루어진 n X n 2차원 리슀트λ₯Ό 생성
  • Aλ„μ‹œμ—μ„œ Bλ„μ‹œλ‘œ κ°€λŠ” λΉ„μš©μ„ 2차원 λ¦¬μŠ€νŠΈμ— μž…λ ₯ λ°›κΈ°
    • Aλ„μ‹œμ—μ„œ Bλ„μ‹œλ‘œ κ°€λŠ” 노선은 μ—¬λŸ¬ κ°œκ°€ μžˆμ„ 수 μžˆμœΌλ―€λ‘œ, κ·Έ 쀑 κ°€μž₯ 적은 λΉ„μš©μ„ 선택
  • ν”Œλ‘œμ΄λ“œ μ•Œκ³ λ¦¬μ¦˜ λ™μž‘
    • 자기 μžμ‹ μ—κ²Œ κ°€λŠ” 노선은 μ—†λ‹€κ³  ν–ˆμœΌλ―€λ‘œ 0 μ²˜λ¦¬
    • κΈ°μ‘΄ λ…Έμ„  λΉ„μš©κ³Ό κ²½μœ μ§€λ‘œ λŒμ•„κ°€λŠ” λ…Έμ„  λΉ„μš© μ€‘ μž‘μ€ 것을 선택
  • κ³„μ‚°λœ 결과값을 λ°”νƒ•μœΌλ‘œ 좜λ ₯
    • 갈 수 μ—†λŠ” λ„μ‹œμ˜ 경우(즉, μ΄ˆκΈ°κ°’ κ·ΈλŒ€λ‘œλΌλ©΄) 0 좜λ ₯
    • μ•„λ‹ˆλΌλ©΄ κ³„μ‚°ν–ˆλ˜ μ΅œμ†Œ λΉ„μš© 좜λ ₯

 


μ†ŒμŠ€ μ½”λ“œ 및 κ²°κ³Ό

import sys
input = sys.stdin.readline

n = int(input())          # λ„μ‹œμ˜ 개수 (2이상 100 μ΄ν•˜)
m = int(input())          # λ²„μŠ€ 개수 (1 이상 100,000 μ΄ν•˜)
costTable = [[sys.maxsize] * n for _ in range(n)]  # 2차원 리슀트 λ§Œλ“€κΈ°

for _ in range(m):        # μ‹œμž‘ λ„μ‹œμ—μ„œ 도착 λ„μ‹œλ‘œ κ°€λŠ” μ—¬λŸ¬ λ…Έμ„  쀑 κ°€μž₯ μž‘μ€ λΉ„μš© λ…Έμ„  선택
    startCity, aliveCity, cost = map(int, input().split())
    costTable[startCity - 1][aliveCity - 1] = min(costTable[startCity - 1][aliveCity - 1], cost)

for wayPoint in range(n):
    costTable[wayPoint][wayPoint] = 0   # 자기 μžμ‹ μ—κ²Œ κ°€λŠ” 노선은 μ—†μœΌλ―€λ‘œ 0 처리
    
    for startCity in range(n):
        for aliveCity in range(n):
            originalRouteCost = costTable[startCity][aliveCity]
            wayPointRouteCost = costTable[startCity][wayPoint] + costTable[wayPoint][aliveCity]
            costTable[startCity][aliveCity] = min(originalRouteCost, wayPointRouteCost)

for costs in costTable:
    for cost in costs:
        if cost == sys.maxsize:
            print(0, end = ' ')
        else:
            print(cost, end = ' ')
    print()

 

sys.stdin.readlin을 처음 μ¨λ΄€λ„€μš”. 이게 더 μž…λ ₯ λ°›λŠ” 속도가 λΉ λ₯΄λ‹€κ³  ν•˜λ”κ΅°μš”.

 

728x90
λ°˜μ‘ν˜•