일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 파이썬 #백준 #알고리즘 #코딩테스트
- 백준 #파이썬 #알고리즘 #코딩테스트
- 투포인터
- java #자바
- 파이썬
- DFS
- 자바 #java
- 백트랙킹
- 백준 #알고리즘 #파이썬 #코딩테스트
- Dijkstra
- 프로그래머스 #파이썬 #코딩테스트 #알고리즘
- dp
- java #자바 #동빈나
- react #리액트 #동빈나 #나동빈 #유튜브강의
- 다익스트라
- 다이나믹프로그래밍
- 코딩테스트
- java #자바 #나동빈
- 프로그래머스
- 백준
- 파이썬 #알고리즘 #코딩테스트 #프로그래머스
- 프로그래머스 #파이썬 #알고리즘 #코딩테스트
- PYTHON
- react #리액트 #동빈나
- BFS
- css #웹 #생활코딩
- 알고리즘
- 재귀
- css #생활코딩 #웹
- java #자바 #생활코딩
Archives
- Today
- Total
커리까지
[백준] 1238번 파티 파이썬 본문
728x90
SMALL
문제
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명의 학생들 중 오고 가는데 가장 오래 걸리는 학생의 소요시간을 출력한다.
예제 입력 1
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
예제 출력 1
10
제출답안
import heapq
import sys
input = sys.stdin.readline
INF = int(1e9)
def solution():
n, m, start = map(int, input().split())
graph = [[] for _ in range(n + 1)]
for _ in range(m):
a, b, c = map(int, input().split())
graph[a].append((b, c))
answer = [0] * (n + 1)
for i in range(1, n + 1):
distance_temp = dijkstra(n, i, graph)
answer[i] += distance_temp[start]
distance_temp = dijkstra(n, start, graph)
answer[i] += distance_temp[i]
print(max(answer))
def dijkstra(n, start, graph):
distance = [INF] * (n + 1)
q = []
heapq.heappush(q, (0, start))
distance[start] = 0
while q:
dist, now = heapq.heappop(q)
if distance[now] < dist:
continue
for i in graph[now]:
cost = dist + i[1]
if cost < distance[i[0]]:
distance[i[0]] = cost
heapq.heappush(q, (cost, i[0]))
return distance
solution()
- 학생수, 도로, 출발지를 받는다.
- 도로 연결 정보를 담는 리스트를 만든다.
- for문을 돌면서 도로수만큼 도로 연결 정보를 업데이트 한다.
- 다익스르라 함수를 2번 사용한 이유는 start로 갔다가 다시 와야 하기 때문에 i번째로 가는 최단 경로를 구해서 start에서 i까지 얼머나 걸리는지
- start의 최단거리를 구해서 i까지 얼마나 걸리는지 각각 더해줘야 하기 때문에 2번 계산한다.
- 다익스트라 함수는 거리를 매번 초기화 해준다.
- 힙을 사용해서 시간을 단축한다.
- q가 빌 때까지 계속 해서 거리를 갱신한다.
- 마지막으로 출력한다.
728x90
LIST
'알고리즘 > 풀이' 카테고리의 다른 글
[백준] 2583번 영역 구하기 파이썬 (0) | 2022.01.25 |
---|---|
[프로그래머스] 키패드 누르기 파이썬 (0) | 2022.01.23 |
[백준] 11399번 문제 파이썬 (0) | 2022.01.18 |
[백준] 14916번 거스름돈 파이썬 (0) | 2022.01.18 |
[백준] 2839번 설탕 배달 파이썬 (0) | 2022.01.17 |
Comments