반응형
백준 1707번 이분 그래프
문제
풀이 코드
1) dfs 풀이
import sys
sys.setrecursionlimit(10 ** 6)
input = sys.stdin.readline
# dfs
def dfs(v, group):
visited[v] = group # 방문한 노드에 group 할당
for i in graph[v]:
if visited[i] == 0: # 아직 안 가본 곳이면 방문
if not dfs(i, -group):
return False
elif visited[i] == visited[v]: # 방문한 곳인데, 그룹이 동일하면 False
return False
return True
for _ in range(int(input())):
V, E = map(int, input().split())
graph = [[] for i in range(V+1)] # 빈 그래프 생성
visited = [0] * (V+1) # 방문한 정점 체크
for _ in range(E):
a,b = map(int, input().split())
graph[a].append(b) # 무방향 그래프
graph[b].append(a) # 무방향 그래프
bipatite = True
for i in range(1, V+1):
if visited[i] == 0: # 방문한 정점이 아니면, dfs 수행
bipatite = dfs(i, 1)
if not bipatite:
break
print('YES' if bipatite else 'NO')
2) bfs 풀이
### bfs
import collections
import sys
sys.setrecursionlimit(10 ** 6)
input = sys.stdin.readline
for _ in range(int(input())):
V, E = map(int, input().split())
graph = [[] for i in range(V+1)] # 빈 그래프 생성
visited = [0] * (V+1) # 방문한 정점 체크
for _ in range(E):
a,b = map(int, input().split())
graph[a].append(b) # 무방향 그래프
graph[b].append(a) # 무방향 그래프
q = collections.deque()
group = 1
bipatite = True
for i in range(1, V+1):
if visited[i] == 0: # 방문하지 않은 정점이면 bfs 수행
q.append(i)
visited[i] = group
while q:
v = q.popleft()
for w in graph[v]:
if visited[w] == 0: # 방문하지 않은 정점이면 큐에 삽입
q.append(w)
visited[w] = -1 * visited[v] # 현재 노드와 다른 그룹 지정
elif visited[v] == visited[w]: # 이미 방문한 경우, 동일한 그룹에 속하면 False
bipatite = False
print('YES' if bipatite else 'NO')
반응형
'Python > 백준' 카테고리의 다른 글
[백준 파이썬] 1753번 최단경로 (0) | 2021.04.21 |
---|---|
[백준 파이썬] 9466번 텀 프로젝트 (0) | 2021.04.20 |
[백준 파이썬] 2150번 Strongly Connected Component (5) | 2021.04.18 |
[백준 파이썬] 2252번 줄 세우기 (0) | 2021.04.18 |
[백준 파이썬] 2606번 바이러스 (0) | 2021.04.13 |