1238번: 파티
첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어
www.acmicpc.net
정답 코드입니당
import sys
import heapq
input = sys.stdin.readline
n, m, x = map(int,input().split())
INF = int(1e9) #10억
arr = [[INF for j in range(n+1)] for i in range(n+1)]
graph = [[] for i in range(n+1)]
for i in range(1,m+1):
start, end, cost = map(int, input().split())
graph[start].append((end, cost))
x
def dijkstra(start, end):
q = []
heapq.heappush(q, (0, start))
distance = [INF] * (n+1)
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[end]
sum = 0
for i in range(1, n+1):
a = dijkstra(i, x)
b = dijkstra(x, i)
sum = max(sum, a + b)
print(sum)
지금 약간 오랜만에 파이썬 해서 이차원 배열 쓰는 법부터 해서 계속 찾아보는 중인데

약간 속터질거 가타요

오찟
그 입력범위가 1000이라서 플로이드 워셜로 하면 n*3?이런 식으로 되니까 시간초과 나서 안된대요...왠지 안 되더라구요...
플로이드 워셜로 한 코드입니당
import sys
input = sys.stdin.readline
n, m, x = map(int,input().split())
INF = 999999;
arr = [[INF for j in range(n+1)] for i in range(n+1)]
for i in range(1,m+1):
start, end, cost = map(int, input().split())
arr[start][end] = cost
if(i <= n):
arr[i][i] = 0
for i in range(1,n+1):
for j in range(1,n+1):
if arr[j][i] == INF:
continue
for k in range(1,n+1):
arr[j][k] = min(arr[j][k], arr[j][i]+arr[i][k])
sum = 0
for i in range(1, n+1):
sum = max(arr[i][x]+arr[x][i], sum)
print(sum)
다익스트라로 다시 짜야겠어요...
다익스트라 for문? 방식으로 한 코드 입니당
import sys
input = sys.stdin.readline
n, m, x = map(int,input().split())
INF = int(1e9) #10억
arr = [[INF for j in range(n+1)] for i in range(n+1)]
graph = [[] for i in range(n+1)]
for i in range(1,m+1):
start, end, cost = map(int, input().split())
graph[start].append((end, cost))
def get_smallest_node(distance, visited):
minValue = INF
idx = 0
for i in range(1, n+1):
if distance[i] < minValue and not visited[i]:
minValue = distance[i]
idx = i
return idx
def dijkstra(start, end):
distance = [INF] * (n + 1)
distance[start] = 0
visited = [False] *(n+1)
visited[start] = True
for i in graph[start]:
distance[i[0]] = i[1]
for i in range(n-1):
now = get_smallest_node(distance, visited)
visited[now] = True
for j in graph[now]:
cost = distance[now] + j[1]
if cost < distance[j[0]]:
distance[j[0]] = cost
return distance[end]
sum = 0
for i in range(1, n+1):
a = dijkstra(i, x)
b = dijkstra(x, i)
sum = max(sum, a + b)
print(sum)
다익스트라로 하는 방법이 두갠데 하나는 for문으로? 하는 방법이래요 근데 지금 읽었는데 이 방법은
전체 노드가 5000개 이하일 때 쓰는거고 10000개 이상이면 개선된 다익스트라 알고리즘을 사용해야한대요
왠지 시간초과 나오더라구요
다른 방법이 heapq이용해서 하는건데
import sys
import heapq
input = sys.stdin.readline
n, m, x = map(int,input().split())
INF = int(1e9) #10억
arr = [[INF for j in range(n+1)] for i in range(n+1)]
graph = [[] for i in range(n+1)]
for i in range(1,m+1):
start, end, cost = map(int, input().split())
graph[start].append((end, cost))
x
def dijkstra(start, end):
q = []
heapq.heappush(q, (0, start))
distance = [INF] * (n+1)
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[end]
sum = 0
for i in range(1, n+1):
a = dijkstra(i, x)
b = dijkstra(x, i)
sum = max(sum, a + b)
print(sum)
오늘 어쩌다보니 플로이드워셜이랑 다익스트라 방법 두개 다로 해봤네요...레죤두...담에 다익스트라 재도전 해봐야겠어요

'BOJ' 카테고리의 다른 글
[python] 백준 1309번 - 동물원 (2) | 2023.07.23 |
---|---|
[python]백준 1261번 - 알고스팟 (2) | 2023.07.22 |
[JAVA] 백준 5107번 - 마니또 (2) | 2023.07.20 |
[JAVA]백준 1043번 - 거짓말 (2) | 2023.07.20 |
[JAVA]백준 1092번 - 배 (0) | 2023.07.18 |
댓글