[백준] 1707 이분 그래프

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

작업에 제시된 두 부분으로 구성된 그래프에 대한 설명은 이해하기 쉽게 다음 블로그에 설명되어 있습니다.

https://hongcoding.tistory.com/20

(백준) 1707 Bipartite Graph (Python)

www.acmicpc.net/problem/1707 No. 1707: 이분 그래프 입력은 여러 테스트 케이스로 구성되며 테스트 케이스의 수 K(2≤K≤5)가 첫 번째 줄에 제공됩니다.

각 테스트 케이스의 첫 줄에는

hongcoding.tistory.com

저도 위 블로그에서 힌트를 얻어 코드를 완성하고 그 결과를 공유합니다.

from sys import stdin
from collections import deque


def bfs(n):
    visited(n) = 1  # 처음 방문한 노드의 색상을 1로 지정, 이웃한 노드의 색상은 -1로 지정한다.

q = deque(()) q.append(n) while q: n = q.popleft() for c in g(n): # 현재 방문한 노드의 이웃한 노드들에 대해 조사한다.

if not visited(c): # 새롭게 방문한 노드에 방문한적 없을 경우 q.append(c) # 이 노드의 이웃을 방문하기 위해 노드 번호를 큐에 추가한다.

visited(c) = -visited(n) # 이 노드는 그전 노드와 다른 색을 가진다 else: # 이미 방문했던 노드일 때 if visited(c) == visited(n): # 이 노드는 이미 색상이 지정되어 있지만 직전 노드와 색상이 같을 경우 return False # 이분 그래프를 만족하지 못하므로 False를 반환한다.

return True for i in range(int(input())): n, m = map(int, input().split()) g = (() for _ in range(n+1)) visited = (0) * (n+1) # 방문하지 않은 노드를 0으로 표시 visited(0) = 1 for j in range(m): a, b = map(int, stdin.readline().split()) g(a).append(b) g(b).append(a) ans="YES" # 연결 그래프일 경우 한번만 수행하면 되지만, 비연결 그래프일 경우 한번에 # 모든 노드를 방문할 수 없으므로 리스트에 0이 없어질 때 까지 반복한다.

while 0 in visited: v = visited.index(0) # 방문하지 않은 노드에 bfs 수행 if not bfs(v): ans="NO" break print(ans)