만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

격자

시간 제한2초메모리 제한1024 MB

요약
n x m 격자에서 일부 칸이 1일 때, 남은 0 칸들이 두 덩어리 이상으로 나뉘도록 바꿔야 하는 0 칸의 최소 개수를 구합니다. 불가능하면 -1을 출력합니다.
난이도

보통10점 중 6점

유형
구현, 기하, 수학
정답자
아직 제출이 없습니다

문제

n×mn \times m 크기의 격자가 있다. 격자에는 cc (0≤c≤nm)(0 \leq c \leq nm)개의 1 칸이 있고, 나머지 칸은 모두 0 칸이다.

변을 공유하는 두 칸을 서로 인접한다고 한다. 두 0 칸은 서로 인접하거나, 두 칸 모두와 연결된 세 번째 0 칸이 있으면 서로 연결되어 있다고 한다.

0 칸 중 일부(0개, 1개, 또는 여러 개)를 1 칸으로 바꾸어, 바꾼 뒤에 서로 연결되지 않은 0 칸 두 개가 존재하도록 하려고 한다.

예를 들어 4×44 \times 4 격자에서 왼쪽 위 모서리와 오른쪽 아래 모서리가 1 칸이고 나머지 칸이 모두 0 칸이라면, 0 칸 두 개를 1 칸으로 바꾸어 목표를 달성할 수 있다. 두 모서리를 잇는 대각선 위의 나머지 두 0 칸을 1 칸으로 바꾸면 된다. 이 경우 2개를 바꾸는 것이 최적이다.

목표를 달성할 수 있는지 판단해야 한다. 달성할 수 있다면 1 칸으로 바꿔야 하는 0 칸의 최소 개수를 출력한다.

입력

입력 파일의 첫 줄에는 테스트 케이스 수 TT가 주어지고, 이어서 TT개의 테스트 케이스가 주어진다. 각 테스트 케이스의 첫 줄에는 세 정수 nn, mm, cc가 주어진다. 다음 cc개의 줄에는 각각 두 정수 xx, yy가 주어지며, 이는 xx행 yy열의 칸이 1 칸임을 뜻한다. 같은 1 칸이 한 테스트 케이스에 두 번 이상 나타나지 않는다. 한 줄에서 인접한 두 정수는 공백으로 구분된다.

출력

각 테스트 케이스에 대해 답을 한 줄에 출력한다. 0 칸 두 개를 서로 연결되지 않게 만들 수 없다면 -1을 출력한다. 그렇지 않다면 1 칸으로 바꿔야 하는 0 칸의 최소 개수를 출력한다.

힌트

모든 테스트 케이스에 대해 1≤n,m≤1091 \leq n,m \leq 10^9, 0≤c≤min⁡(nm,105)0 \leq c \leq \min(nm,10^5), 1≤x≤n1 \leq x \leq n, 1≤y≤m1 \leq y \leq m, 1≤T≤201 \leq T \leq 20이다. 입력 파일에 있는 모든 테스트 케이스의 cc 합을 ∑c\sum c라고 한다. ∑c≤105\sum c \leq 10^5이 보장된다.

예제1

  1. 예제 1

    입력
    4
    4 4 2
    1 1
    4 4
    2 3 1
    1 2
    2 2 2
    1 1
    2 2
    1 1 0
    
    예상 출력
    2
    1
    0
    -1