알고리즘 문제풀이
다리 만들기2(백준 17472)
wiojfe
2023. 10. 2. 13:43
MST를 만드는 것도 중요하지만 그 전에 입력받은 섬들 간의 만들 수 있는 다리들을 구하는 것이 더 중요하다.
섬 하나하나의 좌표에 대해서 4방향에 대해서 모두 도달 가능한 다른 섬을 찾아야 하는 과정이 필요하다.
처음에는 섬인 좌표들 중에서 x혹은 y 좌표가 같은 경우에만 계산하려 하니 다시 수정하기가 어려웠다.
#틀린코드
import sys
from collections import deque
input =sys.stdin.readline
def find(a) :
if a!= parent[a] :
parent[a] = find(parent[a])
return parent[a]
def union(a,b) :
if a >=b :
parent[a] = b
else :
parent[b] = a
def islandcheck(x,y,mark ):
q= deque()
island_arr[x][y] = mark
islandindex.append((mark,x,y))
q.append((x,y))
while q :
x,y = q.popleft()
for i in range(4) :
nx,ny =x+dx[i] , y+dy[i]
if 0<=nx< n and 0<=ny< m and island_arr[nx][ny]==0 and gra[nx][ny]==1:
q.append((nx,ny))
island_arr[nx][ny] = mark
island_pos[mark].append((nx,ny))
islandindex.append((mark,nx,ny))
n,m = map(int, input().split())
gra = []
edges =[] # 가능한 길을 저장하기
island_arr = [[0 for i in range(m)]for j in range(n)] #각각의 섬에 번호 부여됨
island_pos = [[]for i in range(7)]
islandindex= []
for i in range(n) :
oneline = list(map(int, input().split()))
gra.append(oneline)
# print(gra)
dx = [1,-1,0,0]
dy = [0,0,1,-1]
islandcnt =1
for i in range(n):
for j in range(m):
if gra[i][j] ==1 and island_arr[i][j] ==0 :
islandcheck(i,j,islandcnt)
islandcnt += 1
parent = [i for i in range(islandcnt)]
for i in range(len(islandindex)-1) :
for j in range(i, len(islandindex)) :
if islandindex[i][0] != islandindex[j][0] and islandindex[i][1]== islandindex[j][1] and abs(islandindex[i][2]-islandindex[j][2])>=3:
edges.append((abs(islandindex[i][2]-islandindex[j][2])-1, islandindex[i][0], islandindex[j][0]))
elif islandindex[i][0] != islandindex[j][0] and islandindex[i][2]== islandindex[j][2] and abs(islandindex[i][1]-islandindex[j][1])>=3:
edges.append((abs(islandindex[i][1]-islandindex[j][1])-1, islandindex[i][0], islandindex[j][0]))
edges= set(edges)
edges = list(edges)
edges.sort()
print(island_arr)
print(parent)
print(edges)
ans =0
for edge in edges :
cost = edge[0]
a,b = edge[1], edge[2]
fa,fb = find(a),find(b)
if fa== fb :
continue
else :
union(fa,fb)
ans+= cost
print(cost)