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)