Algorithm/백준

[백준/Python] 이분 그래프

poppy 2021. 12. 26. 12:52
반응형

https://www.acmicpc.net/problem/1707

 

1707번: 이분 그래프

입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V와 간선의 개수 E가 빈 칸을 사이에

www.acmicpc.net

이 문제를 풀기에 앞서 이분 그래프의 개념을 알고 가야 한다.

 

이런 식으로 정점의 색깔을 바꾸어 칠하면서 같은 색끼리 간선이 없는 경우 이분 그래프이다. 간선이 있다면 이분 그래프가 될 수 없다. 이것을 코드에 적용하면 문제를 풀 수 있다. 코드에서는 색상을 숫자로 표시하였다. (예 - 파랑은 1로, 빨강은 -1로)

 

from collections import deque
import sys
input = sys.stdin.readline

def bfs(start):
    queue = deque([start])
    visited[start] = 1 # 시작점 그룹은 1로

    while queue:
        v = queue.popleft() # 현재 정점
        for i in graph[v]: # 현재 정점과 연결된 정점이
            if visited[i] == 0: # 방문하지 않았다면 현재 정점과 다른 그룹으로 지정
                queue.append(i)
                visited[i] = -visited[v]
            elif visited[i] == visited[v]: # 이미 방문한 정점이 같은 그룹이라면 False
                return False
    return True

K = int(input())
for _ in range(K):
    V, E = map(int, input().split())
    graph = [[] for _ in range(V+1)] # 연결 리스트
    visited = [0] * (V+1) # 방문한 정점 체크
    result = True # 이분그래프 여부

    for _ in range(E):
        u, v = map(int, input().split())
        graph[u].append(v)
        graph[v].append(u)

    for i in range(1, V+1):
        if visited[i] == 0: # 방문하지 않은 정점이면 bfs 수행
            if not bfs(i): # 이분 그래프가 아니라면 탐색 중단
                result = False
                break
    print('YES' if result else 'NO')

1. 필요한 정보를 입력받은 뒤 방문한 정점을 체크할 수 있는 visited와 이분그래프인지 확인할 수 있는 변수 result를 생성한다.

2. 모든 정점을 탐색한다.

    2-1. 아직 방문하지 않은 정점이라면 bfs를 수행한다.

    2-2. 시작점은 그룹을 1로 만들어주고 큐를 탐색한다.

    2-3. 현재 정점과 연결된 정점들을 가져와 연결된 정점을 방문하지 않았다면 다른 그룹으로 지정한다. 

    2-4. 연결된 정점이 이미 방문했고 현재 정점과 같은 그룹이라면 False를 리턴한다. (같은 그룹(=색상)인데 간선이 있는 것이므로)

    2-5. bfs 수행 결과가 False 라면 이분그래프가 아니므로 탐색을 중단한다.

3. 결과에 따른 출력을 해준다.

반응형

'Algorithm > 백준' 카테고리의 다른 글

[백준/Python] 벽 부수고 이동하기  (0) 2022.01.01
[백준/Python] LCS  (0) 2021.12.30
[백준/Python] 감시  (0) 2021.12.20
[백준/Python] 민겸 수  (0) 2021.12.13
[백준/Python] 크게 만들기  (0) 2021.12.06