본문 바로가기
문제 해결/BOJ

[백준] 백양로 브레이크

by 자잘 2023. 3. 22.

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

 

11562번: 백양로 브레이크

서울 소재 Y모 대학교에서 대규모 공사를 진행하면서, 학교가 마치 미로처럼 변해버리고 말았다. 공사 이전까지는 어떤 건물에서 출발하더라도 다른 모든 건물로 갈 수 있는 길이 있었으나, 공

www.acmicpc.net

플로이드-와샬을 활용하면 풀이가 가능한 문제입니다. a b사이의 간선이 양방향인 경우에는 dist 배열에 dist[a][b], dist[b][a]를 0으로 만들어주고 a b사이의 간선이 양방향이 아닌 경우에는 dist[a][b]=0, dist[b][a]=1을 넣어주면 됩니다. 이렇게 해주면 단방향 간선으로 양방향으로 바꾸는 효과가 생기게 됩니다. 따라서  a-b사이의 간선을 양방향으로 바꾸었을 때의 최소 변경회수가 자동으로 계산이 되게 됩니다.

 

import sys
#sys.stdin = open("input.txt", "r")
INT_MAX = sys.maxsize

input = sys.stdin.readline
n, m = tuple(map(int, input().split()))

dist = [
    [INT_MAX] * (n + 1)
    for _ in range(n + 1)
]

# i -> i 경로 초기화
for i in range(1, n + 1):
    dist[i][i] = 0

for _ in range(m):
    a, b, w = tuple(map(int, input().split()))

    if w == 0:
        dist[a][b] = 0
        dist[b][a] = 1
    else:
        dist[a][b] = 0
        dist[b][a] = 0

# 플로이드-와샬을 통해 모든 정점간의 도달가능한지를 체크해둔다.
for k in range(1, n + 1):
    for i in range(1, n + 1):
        for j in range(1, n + 1):
            dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])

q = int(input())
for _ in range(q):
    a, b = tuple(map(int, input().split()))
    print(dist[a][b])

'문제 해결 > BOJ' 카테고리의 다른 글

[백준] 양팔저울  (0) 2023.03.24
[백준] 치즈  (1) 2023.03.23
[백준] 학교 탐방하기  (0) 2023.03.21
[백준] 동방 프로젝트(large)  (0) 2023.03.20
[백준] 나만 안되는 연애  (1) 2023.03.19