[BOJ] 1012

Jisung Park·2020년 11월 29일

algortihm

목록 보기
3/15

# import sys
from collections import deque

"""
연결된 그래프 덩어리 개수를 찾는 문제

1) 임의의 점을 시작으로 bfs 를 돌린다.
2) bfs 가 종료되면 방문하지 않은 다른점을 시작으로 다시 bfs를 돌린다.

위 동작을 반복한 횟수가 그래프 개수다.


*
그래프 정보가 인접리스트 + 노드 번호로 주어진 경우
연결정보와 방문여부를 저장하는 변수를 만든다


graph: dict, graph[v1] = [v2, v3, v4...]
visited: list, visited[v1] = False


그래프 정보가 좌표로 주어진 경우
좌표 탐색 방향은 정해져 있으므로 (상하좌우) 방문 여부만 저장한다

좌표 탐색시 각 점의 상하좌우의 방문 가능 여부 (visited에 해당 점이 있는지)를 검사하고
방문 여부를 검사한 후 que에 넣는

visited: list, visited[(x, y)] = False

"""

dx = [0, 0, 1, -1]다
dy = [1, -1, 0, 0]
def bfs(visited, root):
    que = deque([root])
    visited[root] = True

    while que:
        v = que.popleft()
        # print(v, end=' ')
        for nx, ny in zip(dx, dy):
            new_v = (v[0] + nx, v[1] + ny)
            if new_v not in visited:
                continue

            if visited[new_v]:
                continue

            visited[new_v] = True
            que.append(new_v)



# sys.stdin = open('1012.txt')

T = int(input())

for t in range(T):
    M, N, K = list(map(int, input().split()))

    visited = dict()
    for k in range(K):
        x,y = list(map(int, input().split()))
        visited[(x,y)] = False

    # print(visited)

    cnt = 0
    nodes = visited.keys()
    for n in nodes:
        if visited[n]:
            continue

        bfs(visited, n)
        cnt += 1
    print(cnt)


0개의 댓글