코딩테스트[파이썬]/이것이 코딩테스트다(이코테)

[최단거리] - 미래도시 (플로이드 워샬)

softmoca__ 2024. 2. 3. 14:52
목차

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)

 

나의 코드와 거진 일치 한다 !