목차

다리 만들기 2

ps
링크acmicpc.net/…
출처BOJ
문제 번호17472
문제명다리 만들기 2
레벨골드 2
분류

최소 신장 트리, 구현

시간복잡도O(nlogn)
인풋사이즈n<=100
사용한 언어Python
제출기록34808KB / 144ms
최고기록56ms
해결날짜2021/10/21
태그

30단계

풀이

코드

"""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()