[백준] 1162번, 도로포장 (Python)

2021. 7. 22. 12:21·알고리즘/백준
728x90
반응형

문제

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

 

1162번: 도로포장

첫 줄에는 도시의 수 N(1 ≤ N ≤ 10,000)과 도로의 수 M(1 ≤ M ≤ 50,000)과 포장할 도로의 수 K(1 ≤ K ≤ 20)가 공백으로 구분되어 주어진다. M개의 줄에 대해 도로를 연결짓는 두 도시와 도로를 통과하

www.acmicpc.net

 

코드

import heapq
import sys
input = sys.stdin.readline
INF = sys.maxsize
n, m, k = map(int, input().split())

graph = [[] for _ in range(n+1)]
distance = [[INF for _ in range(k+1)] for _ in range(n+1)] # 도로를 몇개 포장했는지 확인하기 위해서 이중리스트로 만든다.
for i in range(m):
    x,y,z = map(int,input().split())
    graph[x].append((z,y))
    graph[y].append((z,x))

def dijkstra(start):
    queue = []
    cnt = 0
    distance[start][cnt] = 0
    heapq.heappush(queue, (0, start, cnt))

    while queue:
        wei, now, cnt = heapq.heappop(queue)
        if distance[now][cnt] < wei:
            continue
        for w, next_node in graph[now]:
            next_wei = w + wei
            if distance[next_node][cnt] > next_wei:
                distance[next_node][cnt] = next_wei
                heapq.heappush(queue, (next_wei, next_node,cnt))
                
            # elif로 안하고 if로 하는 이유는 모든곳을 돌아 도로포장을 했을때 가장 작은 값을 찾기 위해서이다.
            if cnt < k and distance[next_node][cnt+1] > wei: 
            # 도로포장 횟수가 남았고 현재까지 distance[next_node][cnt+1](next_node 까지 가중치)가 wei(now 노드까지 가중치)보다 크다면 
            # next_node까지 움직이는 w(now에서 next_node까지 가중치)를 무시하고 wei를 넣어준다.
                distance[next_node][cnt+1] = wei
                heapq.heappush(queue, (wei, next_node, cnt+1))


dijkstra(1)
print(min(distance[n]))

가중치가 주어지고 특정지점까지 가장 짧은 경로를 구하는 문제로 다익스트라 문제이다.

 

처음에 도로포장을 해주는것을 어떻게 표현해야 할지 몰라 검색을 했다..

distance 리스트를 이중리스트로 만들어 도로포장을 몇번했는지에 따라 값을 저장한다.

 

다익스트라를 수행하는데 도로포장 횟수가 아직 남았고 현재노드 까지 가중치보다 다음 노드까지 저장된 가중치가 크다면 도로포장을 해준다.

 

도로포장을 할 수 있는 모든 곳에서 도로포장을 했을때 가장 작은 시간이 걸리는 값을 출력한다.

반응형
저작자표시 (새창열림)

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 1912번, 연속합 (Python)  (0) 2021.07.30
[백준] 10815번, 숫자 카드 (Python)  (0) 2021.07.27
[백준] 2573번, 빙산 (Python)  (0) 2021.07.21
[백준] 11725번, 트리의 부모 찾기 (Python)  (0) 2021.07.21
[백준] 11403번, 경로 찾기 (Python)  (0) 2021.07.21
'알고리즘/백준' 카테고리의 다른 글
  • [백준] 1912번, 연속합 (Python)
  • [백준] 10815번, 숫자 카드 (Python)
  • [백준] 2573번, 빙산 (Python)
  • [백준] 11725번, 트리의 부모 찾기 (Python)
wookcode
wookcode
공부한 내용들을 정리하고 기록하는 블로그입니다.
    반응형
  • wookcode
    wookcode
    wookcode
  • 전체
    오늘
    어제
    • 카테고리 (196) N
      • study (1) N
        • 아파치 카프카 애플리케이션 프로그래밍 with 자.. (0)
        • 인프런 (1) N
      • Live Study (15)
      • Programming (14)
        • Java (8)
        • Python (1)
        • Springboot (5)
        • MSA (0)
      • 알고리즘 (117)
        • 백준 (58)
        • 프로그래머스 (59)
      • 에러로그 (5)
      • 항해99 (23)
      • 면접 (1)
      • 프로젝트 (1)
      • CS (19)
        • 네트워크 (2)
        • 운영체제 (2)
        • 데이터베이스 (2)
        • 컴퓨터구조 (1)
        • Java (8)
        • Spring (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    spring
    인프런
    항해99
    브루트포스
    카카오인턴
    그리디
    항해마켓
    SFlash
    파이썬
    해결
    java
    미니프로젝트
    실전프로젝트
    회고
    알고리즘
    정리
    orm
    김영한
    jpa
    코딩테스트
    조합
    버그
    괄호
    에러
    프로그래머스
    SpringBoot
    후기
    백준
    카카오코딩테스트
    스파르타코딩클럽
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
wookcode
[백준] 1162번, 도로포장 (Python)
상단으로

티스토리툴바