목차
n개의 노드와 m개의 간선의 정보를 받은 뒤
1번노드에서 출발하여 k번 노드를 거쳐 x번 노드로 가는 최소 시간을 구하라 !!
입력 조건에서 n,m이 모두 1이상 100이하 이니 플로이드 워샬 ㄱㄱ
나의 코드
n,m=map(int,input().split())
INF=int(1e9)
graph=[[INF]*(n+1) for _ in range(n+1)]
for i in range(n+1):
for j in range(n+1):
if i ==j:
graph[i][j]=0
for i in range(m):
a,b=map(int,input().split())
graph[a][b]=1
graph[b][a]=1
x,k=map(int,input().split())
for q in range(1,n+1):
for w in range(1,n+1):
for r in range(1,n+1):
graph[w][r]=min(graph[w][r],graph[w][q]+graph[q][r])
if graph[1][k]+graph[k][x] >INF:
print(-1)
else:
print(graph[1][k]+graph[k][x])
전형 적인 플로이드 워샬 알고리즘 문제이며 모든 노드로 부터 노드까지의 최소 값을 구한 뒤 출력 값에서 요구한 1에서 k까지의 거리와 k부터 x까지의 최소 비용을 합하면 최종 출력 값이 나온다.
양방향 ! 이라는 문제의 조건을 잊어서 소요 시간이 더 걸렸다 !
문제를 더 꼼꼼히 인지해야 겠다 ~
정답 코드
INF = int(1e9) # 무한을 의미하는 값으로 10억을 설정
# 노드의 개수 및 간선의 개수를 입력받기
n, m = map(int, input().split())
# 2차원 리스트(그래프 표현)를 만들고, 모든 값을 무한으로 초기화
graph = [[INF] * (n + 1) for _ in range(n + 1)]
# 자기 자신에서 자기 자신으로 가는 비용은 0으로 초기화
for a in range(1, n + 1):
for b in range(1, n + 1):
if a == b:
graph[a][b] = 0
# 각 간선에 대한 정보를 입력 받아, 그 값으로 초기화
for _ in range(m):
# A와 B가 서로에게 가는 비용은 1이라고 설정
a, b = map(int, input().split())
graph[a][b] = 1
graph[b][a] = 1
# 거쳐 갈 노드 X와 최종 목적지 노드 K를 입력받기
x, k = map(int, input().split())
# 점화식에 따라 플로이드 워셜 알고리즘을 수행
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])
# 수행된 결과를 출력
distance = graph[1][k] + graph[k][x]
# 도달할 수 없는 경우, -1을 출력
if distance >= 1e9:
print("-1")
# 도달할 수 있다면, 최단 거리를 출력
else:
print(distance)
나의 코드와 거진 일치 한다 !
'코딩테스트[파이썬] > 이것이 코딩테스트다(이코테)' 카테고리의 다른 글
[ 그래프] - 신장트리와 크루스칼 알고리즘 (0) | 2024.02.03 |
---|---|
[그래프] - 서로소 집합과 사이클 판별 (0) | 2024.02.03 |
[최단거리] - 플로이드 워셜 알고리즘 (2) | 2024.02.03 |
[최단거리] - 전보(다익스트라) (4) | 2024.02.02 |
[최단거리]- 힙을 사용한 다익스트라 알고리즘 (2) | 2024.02.02 |