문제
https://www.acmicpc.net/problem/2146
알고리즘
1. bfs그래프 탐색을 통해서 1로 되어 있는 땅을 2, 3, 4 .. 으로 각 구역을 숫자로 구분한다
2. 다음 bfs 탐색을 통해서 시작 구역의 위치를 queue에 담아둔다
3. 탐색 과정에서 자신의 구역과 다른 구역을 만났을 때 최단거리를 반환한다
코드
import sys
from collections import deque
def Input_Data():
input = sys.stdin.readline
N = int(input())
graph = []
for _ in range(N+1):
graph.append(list(map(int, input().split())))
return N, graph
d = ((0,1),(0,-1),(1,0),(-1,0))
def Bfs(area, i, j):
q = deque()
q.append((i,j))
graph[i][j] = area
visited[i][j] = 1
while q:
x, y = q.popleft()
for dx, dy in d:
nx, ny = x + dx, y + dy
if not (0<=nx<N and 0<=ny<N): continue
if visited[nx][ny] == 0 and graph[nx][ny] > 0:
graph[nx][ny] = area
visited[nx][ny] = 1
q.append((nx,ny))
def Bridge_Bfs(v):
q = deque()
for i in range(N):
for j in range(N):
if graph[i][j] == v:
q.append((i,j))
visited[i][j] = 0
while q:
x, y = q.popleft()
for dx, dy in d:
nx, ny = x + dx, y + dy
if not (0<=nx<N and 0<=ny<N): continue
# 다른 섬을 만난 경우
if graph[nx][ny] != v and graph[nx][ny] > 0 :
return visited[x][y]
# 물을 지나가는 경우
if visited[nx][ny] == -1 and graph[nx][ny] == 0:
visited[nx][ny] = visited[x][y] + 1
q.append((nx,ny))
return 1e9
N, graph = Input_Data()
visited = [[0] * (N) for _ in range(N)]
cnt = 1
for i in range(N):
for j in range(N):
if graph[i][j] == 1 and visited[i][j] == 0:
cnt+=1
Bfs(cnt, i, j)
ans = 1e9
for i in range(2, cnt+1):
visited = [[-1] * (N) for _ in range(N)]
ans = min(ans, Bridge_Bfs(i))
print(ans)
'Algorithm' 카테고리의 다른 글
[백준 1987] 알파벳 (0) | 2024.09.17 |
---|---|
[백준 1922] 네트워크 연결 (0) | 2024.09.17 |
[백준 1431] 시리얼 번호 (0) | 2024.09.17 |
[백준 1092] 배 (0) | 2024.09.17 |
[백준 5014] 스타트링크 (0) | 2024.09.02 |