[Python] BOJ / 1238번 / 파티

2022. 4. 28. 12:24·🥇 Problem Solving/Dijkstra
 

채점 현황

 

www.acmicpc.net

 

문제

N개의 숫자로 구분된 각각의 마을에 한 명의 학생이 살고 있다.

어느 날 이 N명의 학생이 X (1 ≤ X ≤ N)번 마을에 모여서 파티를 벌이기로 했다. 이 마을 사이에는 총 M개의 단방향 도로들이 있고 i번째 길을 지나는데 Ti(1 ≤ Ti ≤ 100)의 시간을 소비한다.

각각의 학생들은 파티에 참석하기 위해 걸어가서 다시 그들의 마을로 돌아와야 한다. 하지만 이 학생들은 워낙 게을러서 최단 시간에 오고 가기를 원한다.

이 도로들은 단방향이기 때문에 아마 그들이 오고 가는 길이 다를지도 모른다. N명의 학생들 중 오고 가는데 가장 많은 시간을 소비하는 학생은 누구일지 구하여라.

입력

첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어온다. 시작점과 끝점이 같은 도로는 없으며, 시작점과 한 도시 A에서 다른 도시 B로 가는 도로의 개수는 최대 1개이다.

모든 학생들은 집에서 X에 갈수 있고, X에서 집으로 돌아올 수 있는 데이터만 입력으로 주어진다.

출력

첫 번째 줄에 N명의 학생들 중 오고 가는데 가장 오래 걸리는 학생의 소요시간을 출력한다.

풀이

각각의 마을에서 X번 마을로 가는 최단 시간을 구하고, X번 마을에서 다른 모든 마을로 가는 최단 시간을 구해야하므로 다익스트라 알고리즘을 사용하였습니다.

 

위에서 말했듯 다익스트라 알고리즘을 각각의 마을에서 X번 마을로 가는 최단 시간을 구할 때 한 번, X번 마을에서 다른 모든 마을로 가는 최단 시간을 구할 때 한 번, 총 두 번 수행해야 합니다.

 

저의 경우엔 우선 다른 모든 마을에서 X번 마을로 가는 최단 시간을 구해 배열에 따로 저장해놓은 뒤, X번 마을에서 다른 모든 마을로 가는 최단 시간을 구해 해당 배열과 더하여 왕복하는데 걸리는 시간을 구한 뒤, 해당 배열에서 가장 큰 값을 찾는 식으로 구현하였습니다.


import sys
import heapq

# 전처리 부분
input = sys.stdin.readline
INF = sys.maxsize

# 알고리즘 부분
def dijkstra(start):
    heap = [[0, start]]
    time[start] = 0

    while heap:
        cost, node = heapq.heappop(heap)

        for n_cost, n_node in edges[node]:
            if time[n_node] > cost + n_cost:
                time[n_node] = cost + n_cost
                heapq.heappush(heap, [time[n_node], n_node])

# 변수 선언 및 초기화 부분
n, m, x = map(int, input().split())
edges = [[] for _ in range(n + 1)]
for _ in range(m):
    a, b, c = map(int, input().split())
    edges[a].append([c, b])
result = [0] * (n + 1)
ans = 0

# 메인 코드 부분
for i in range(1, n + 1):
    time = [INF] * (n + 1)
    dijkstra(i)
    result[i] = time[x]

time = [INF] * (n + 1)
dijkstra(x)

for i in range(1, n + 1):
    result[i] += time[i]
    ans = max(ans, result[i])

print(ans)
저작자표시 (새창열림)

'🥇 Problem Solving > Dijkstra' 카테고리의 다른 글

[Python] BOJ / 1956번 / 운동  (0) 2022.04.29
[Python] BOJ / 1261번 / 알고스팟  (0) 2022.04.28
[Python] BOJ / 1916번 / 최소비용 구하기  (0) 2022.04.16
[Python] BOJ / 1753번 / 최단경로  (0) 2022.04.16
[C++] BOJ / 1238번 / 파티  (0) 2022.03.26
'🥇 Problem Solving/Dijkstra' 카테고리의 다른 글
  • [Python] BOJ / 1956번 / 운동
  • [Python] BOJ / 1261번 / 알고스팟
  • [Python] BOJ / 1916번 / 최소비용 구하기
  • [Python] BOJ / 1753번 / 최단경로
Baeg-won
Baeg-won
  • Baeg-won
    좋았다면 추억이고 나빴다면 경험이다.
    Baeg-won
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 🍃 Spring, Spring Boot
        • 스프링 프레임워크 기초
        • 스프링 핵심 원리 - 기본편
        • 자바 ORM 표준 JPA 프로그래밍 - 기본편
        • 스프링 MVC
        • 실전! 스프링 부트와 JPA 활용1 - 웹 애플리..
      • 🥑 Web Technoloy
      • 🚗 Backend Toy Project
        • 스프링 부트 게시판
        • Photogram
        • Baeg-won Clothing Gallery
      • 🥇 Problem Solving
        • Breadth-First Search
        • Depth-First Search
        • Backtracking
        • Simulation
        • Two-pointer
        • Binary Search
        • Greedy
        • Dynamic Programming
        • Minimum Spanning Tree
        • Dijkstra
        • Floyd warshall
      • ☕ Java
        • 명품 자바 에센셜
        • Applications
      • 🍦 JavaScript
        • JavaScript 기초
      • 🐧 Linux
        • 이것이 리눅스다(CentOS 8)
      • 📟 Database
        • 혼자 공부하는 SQL
      • 🧬 Data Structure
      • 🎬 HTML
      • 🎤 Tech Interview
      • 📌 etc
        • Unity 2D Raising Jelly Game
        • C++
        • 영어 쉐도잉
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Baeg-won
[Python] BOJ / 1238번 / 파티
상단으로

티스토리툴바