| ps | |
|---|---|
| 링크 | acmicpc.net/… |
| 출처 | BOJ |
| 문제 번호 | 17472 |
| 문제명 | 다리 만들기 2 |
| 레벨 | 골드 2 |
| 분류 |
최소 신장 트리, 구현 |
| 시간복잡도 | O(nlogn) |
| 인풋사이즈 | n<=100 |
| 사용한 언어 | Python |
| 제출기록 | 34808KB / 144ms |
| 최고기록 | 56ms |
| 해결날짜 | 2021/10/21 |
| 태그 | |
"""Solution code for "BOJ 17472. 다리 만들기 2".
- Problem link: https://www.acmicpc.net/problem/17472
- Solution link: http://www.teferi.net/ps/problems/boj/17472
Tags: [Implementation] [MST]
"""
import itertools
from teflib import tgraph
SEA = -1
def main():
N, M = [int(x) for x in input().split()] # pylint: disable=unused-variable
grid = []
id_iter = itertools.count()
for _ in range(N):
row = input().split()
grid.append([next(id_iter) if x == '1' else SEA for x in row])
edges = []
rows, cols = grid, list(zip(*grid))
for line in rows + cols:
u, length = None, 0
for prev, cur in zip(line, line[1:]):
if prev == cur == SEA:
length += 1
elif prev == SEA:
if length > 1 and u is not None:
edges.append((length, u, cur))
elif cur == SEA:
u, length = prev, 1
else:
edges.append((0, prev, cur))
try:
land_count = next(id_iter)
answer = tgraph.minimum_spanning_tree_from_edges(land_count, edges)
except ValueError:
answer = -1
print(answer)
if __name__ == '__main__':
main()