알고리즘/[python] 백준 BOJ
[python] 백준 11562 백양로 브레이크
Alan_Kim
2024. 4. 3. 09:26
728x90
반응형
https://www.acmicpc.net/problem/11562
11562번: 백양로 브레이크
서울 소재 Y모 대학교에서 대규모 공사를 진행하면서, 학교가 마치 미로처럼 변해버리고 말았다. 공사 이전까지는 어떤 건물에서 출발하더라도 다른 모든 건물로 갈 수 있는 길이 있었으나, 공
www.acmicpc.net
문제 해결
- graph[u][v] : u에서 v까지 가는데 필요한 양방향화 필요한 길 개수
- 처음에 INF로 정의한다음 연결되어있다고 입력값이 주어지만 graph[u][v] = 0
- 만약 양방향이 아니고 u→v는 연결이 되어있는데 v→u는 연결이 안되어있으면 graph[v][u] = 1로 정의
- 플로이드-위셜을 이용하여 필요한 양방향화 길의 개수를 구할 수 있다.
- 플로이드-위셜로 최소거리가 아닌 필요한 양방향화 길의 갯수 등도 구할 수 있다는 유형을 처음 접해보았다.
CODE
import sys
input = sys.stdin.readline
INF = int(sys.maxsize)
def Floyd():
for k in range(1,n+1):
for i in range(1,n+1):
for j in range(1,n+1):
if graph[i][j] > graph[i][k] + graph[k][j]: # 어떻게 해서라도 i에서 j로 못가는 경우 최소 양방이 필요한 개수
graph[i][j] = graph[i][k] + graph[k][j]
for i in range(n+1):
graph[i][i] = 0
if __name__ == "__main__":
n, m = map(int, input().split())
graph = [[INF for _ in range(n+1)] for _ in range(n+1)]
for _ in range(m):
u, v, b = map(int, input().split())
if b==0:
graph[u][v] = 0
graph[v][u] = 1
else:
graph[u][v] = 0
graph[v][u] = 0
Floyd()
for _ in range(int(input())):
s, e = map(int, input().split())
print(graph[s][e])
728x90
반응형