최소 신장 트리 예제 - 2
문제 분석
손으로 풀어보기
슈도코드
n, m(행렬 크기)
dx, dy(네 방향 탐색 상수)
map(맵 정보 리스트)
visit(BFS 방문 리스트)
for n 반복:
map 정보 저장
num(섬 번호)
sumlist(모든 섬 정보 이중 리스트)
mlist(1개의 섬 정보 리스트)
addNode(i, j, qu):
map에서 i, j 위치에 섬 번호 저장
해당 위치 방문 표시
mlist에 해당 노드 추가
BFS를 위한 큐에 해당 노드 추가
BFS(i, j):
i, j위치에서 네 방향으로 연결된 모든 노드를 탐색하여 1개 섬의 영역을 저장
연결된 새로운 노드가 확인하면 addNode를 통해 정보 저장
for i n 반복:
for j m 반복:
BFS(i, j) # BFS를 실행해 하나의 섬 정보를 가져오기
BFS 결과(하나의 섬 정보)를 sumlist에 추가
섬 번호 1 증가
pq(우선순위 큐)
for sumlist:
now(sumlist에서 추출)
for now :
1개의 섬의 모든 위치에서 만들 수 있는 다리 정보 저장
# 우선순위 큐에 에지 정보 저장
find(a):
a가 대표 노드면 리턴
아니면 a의 대표 노드값을 find(parent[a])값으로 저장
union(a, b):
a와 b의 대표 노드 찾기
두 원소의 대표 노드끼리 연결
parent(대표 노드 저장 리스트)
useEdge(에지 사용 횟수 변수)
result(정답 변수)
while 큐가 빌 때까지:
큐에서 에지 정보 가져오기
if 에지 시작점과 끝점의 부모 노드가 다르면:
union 수행
에지 가중치 result에 더하기
에지 사용 횟수 1 증가
if 사용한 에지의 수가 노드-1이면:
result 출력
else:
-1 출력코드 구현 - 파이썬
코드 구현 - 자바
Last updated