문제 링크
https://www.acmicpc.net/problem/1238
1238번: 파티
첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어
www.acmicpc.net
풀이
-플로이드 워셜로 풀었는데 시간초과 .. 은근 플로이드 워셜로 시간초과나는 문제가 많은 것 같다.
# 시간 초과 코드
import sys
input = sys.stdin.readline
n, m, x = map(int,input().split())
INF = int(1e9)
graph = [[INF]*(n+1) for _ in range(n+1)]
for _ in range(m):
a, b, c = map(int,input().split())
graph[a][b] =c
for i in range(n):
for j in range(n):
if i == j :
graph[i][j] = 0
for k in range(1,n+1):
for a in range(1,n+1):
for b in range(1,n+1):
graph[a][b] = min(graph[a][b], graph[a][k]+graph[k][b])
result = 0
for i in range(1,n+1):
result = max(result, graph[i][x]+graph[x][i])
print(result)
- 다익스트라로 풀어보았다. 통과
import sys, heapq
input = sys.stdin.readline
def dijkstra(start):
distance = [INF] * (n+1)
distance[start] = 0
q = []
heapq.heappush(q,(0,start))
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]]:
heapq.heappush(q,(cost,i[0]))
distance[i[0]] = cost
return distance
n, m, x = map(int,input().split())
INF = int(1e9)
graph = [ [] for _ in range(n+1)]
for _ in range(m):
a, b, c = map(int,input().split())
graph[a].append((b,c))
# x에서 다른 노드까지의 거리 저장
dist = dijkstra(x)
result = 0
for i in range(1,n+1):
# i에서 다른 노드까지의 거리
tmp = dijkstra(i)
# i에서 x 까지의 최단 거리 + x에서 i까지 최단 거리 최솟값 구하기
result = max(result, dist[i] + tmp[x])
print(result)
'개발 > algorithm' 카테고리의 다른 글
[백준 1913번] 달팽이 - python (0) | 2022.03.17 |
---|---|
[백준 11657번] 타임머신 - python (0) | 2022.03.12 |
[백준 1167번] 트리의 지름 - python (0) | 2022.03.11 |
[백준 14938번] 서강 그라운드 - python (0) | 2022.03.11 |
[백준 9935번] 문자열 폭발 - python (0) | 2022.03.11 |