코딩하는 해맑은 거북이

[Python] 저울 - 백준 (최단경로) 본문

코딩테스트

[Python] 저울 - 백준 (최단경로)

#CJE 2023. 9. 19.
해당 글은 백준 10159번 '저울' 문제를 다룬다.

문제

https://www.acmicpc.net/problem/10159

 

10159번: 저울

첫 줄에는 물건의 개수 N 이 주어지고, 둘째 줄에는 미리 측정된 물건 쌍의 개수 M이 주어진다. 단, 5 ≤ N ≤ 100 이고, 0 ≤ M ≤ 2,000이다. 다음 M개의 줄에 미리 측정된 비교 결과가 한 줄에 하나씩

www.acmicpc.net

 

설명

해당 문제는 최단 경로 찾기 문제 중 플로이드-워셜 알고리즘을 활용하여 해결할 수 있다.

여기서 그래프는 이동 가능할 때 True, 이동 불가능 할 때 False로 만들었다.

플로이드-워셜 알고리즘으로 i->j로 이동할 때, k를 거쳐서 이동가능한 경우도 True로 변경해준다.

마지막 출력으로 i->j로 이동 불가능하고, j->i로도 이동 불가능한 경우에만 카운트하면 된다. 

 

코드

n = int(input())
m = int(input())

# True: 이동O, False: 이동X
graph = [[False] * (n + 1) for _ in range(n + 1)]

for i in range(1, n + 1):  # 현재 위치
    graph[i][i] = True

for _ in range(m):
    a, b = map(int, input().split())
    graph[a][b] = True

for k in range(1, n + 1):
    for i in range(1, n + 1):
        for j in range(1, n + 1):
            if graph[i][k] and graph[k][j]:  # k를 거쳐서 i->j로 이동할 수 있을때
                graph[i][j] = True

for i in range(1, n + 1):
    count = 0
    for j in range(1, n + 1):
        if not graph[i][j] and not graph[j][i]:  # 둘다 0일 경우
            count += 1
    print(count)

     

 

 

Comments