Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- android
- BAEKJOON
- DFS와BFS
- Python
- 파이썬
- 안드로이드
- cos
- issue
- 분할정복
- django
- AndroidStudio
- vuejs
- cos pro 1급
- codingtest
- 동적계획법
- DFS
- Algorithm
- 코테
- 개발
- Flutter
- 코드품앗이
- DART
- Vue
- 동적계획법과최단거리역추적
- 알고리즘
- 안드로이드스튜디오
- 코딩테스트
- 백준
- C++
- cos pro
Archives
- Today
- Total
Development Artist
[Baekjoon, Python] 1707번 : 이분 그래프 본문
728x90
반응형
도입
백준 단계별 풀기 DFS와 BFS 열 번째 문제이다.
DFS와 BFS
DFS
- Root Node 혹은 다른 임의의 Node에서 이어진 Branch를 완벽하게 탐색하고 다른 이어진 Branch로 넘어가는 방법.
한 방향으로 계속 가서 끝을 마주하면 다른 방향으로 설정해서 마찬가지로 진행.
- Stack 또는 Recursive함수로 구현.
- 시간 복잡도 : 인접 리스트는 $O(V+E)$ 인접 행렬은 $O(V^2)$ // 접점(V), 간선(E)
BFS
- Root Node 혹은 다른 임의의 Node에서 이어진 Branch들의 바로 하나 건너 있는 Node들을 먼저 탐색.
- Queue로 구현
- 시간 복잡도 : 인접 리스트는 $O(V+E)$ 인접 행렬은 $O(V^2)$ // 접점(V), 간선(E)
이분그래프
풀이
1. 쉽게 말해서 이분그래프란, 인접한 정점끼리 서로 다른 색으로 칠(빨,파)해서 모든 정점을 두가지 색으로 칠할 수 있는 그래프라고 보면 된다. 나는 mat_visit에서 1을 빨강, -1를 파랑으로 가정한다. 한 꼭짓점을 방문해서 연결된 다른 꼭짓점들의 visit 정보를 수정한다.
2. BFS로 푼다. 입출력 예제 1, 2를 구현한 BFS에 돌려서 본 결과 이다. 아래는, 초기의 mat_table과 완성된 mat_visit 변수의 결과 값이다.
코드
from sys import stdin
from collections import deque
def bfs(var_vtx):
mat_visit[var_vtx] = 1
queue = deque()
queue.append(var_vtx)
while queue:
vtx = queue.popleft()
for i in mat_table[vtx]:
if mat_visit[i] == 0:
mat_visit[i] = -mat_visit[vtx]
queue.append(i)
else:
if mat_visit[i] == mat_visit[vtx]:
return False
return True
var_T = int(stdin.readline())
for _ in range(var_T):
var_V,var_E = map(int, stdin.readline().split())
bool_isBi = True
mat_table = [[] for i in range(var_V+1)]
mat_visit = [0 for i in range(var_V+1)]
for _ in range(var_E):
var_a,var_b = map(int, stdin.readline().split())
mat_table[var_a].append(var_b)
mat_table[var_b].append(var_a)
for i in range(1,var_V+1):
if mat_visit[i] == 0:
if not bfs(i):
bool_isBi = False
break
print("YES"if bool_isBi else "NO")
마무리
BFS에서 1, -1 로 설정해서 바꿔주는 BFS 로직이 생각보다 어려웠다. 바로 떠올리지 못한 점이 아쉽다.
728x90
반응형
'Algorithm > Baekjoon' 카테고리의 다른 글
[Baekjoon, Python] 1504번 : 특정한 최단 경로 (0) | 2021.03.19 |
---|---|
[Baekjoon, Python] 1753번 : 최단경로 (0) | 2021.03.17 |
[Baekjoon, Python] 7562번 : 나이트의 이동 (0) | 2021.03.14 |
[Baekjoon, Python] 2206번 : 벽 부수고 이동하기 (0) | 2021.03.13 |
[Baekjoon, Python] 1697번 : 숨바꼭질 (0) | 2021.03.10 |
Comments