#문제
1707번: 이분 그래프
입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K(2≤K≤5)가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V(1≤V≤20,000)와 간선의 개수
www.acmicpc.net
#풀이 & 학습한 내용
"그래프 순회를 통해 이분 그래프를 판별하는 문제"입니다. 이분 그래프를 판정하는 방법으로 인접한 vertex가 서로 다른 두 가지 색으로만 그래프가 칠해진다는 점을 이용하면 됩니다. 이때, 그래프가 연결 그래프라는 조건이 없으므로, disconnected graph에 대해서도 고려하며 문제를 풀어야 합니다. input()을 쓰면 PyPy3에서는 통과되지만 Python3에서는 통과되지 않으므로 sys.stdin.readline()을 이용해야 합니다.(velog.io/@yeseolee/Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%85%EB%A0%A5-%EC%A0%95%EB%A6%ACsys.stdin.readline)
#소스코드
from collections import deque #큐 사용하기 위해
import sys # input().split() -> sys.stdin.realine().split()으로 해야 Python3로 통과됨
WHITE=0 #방문한적없는 vertex일 때(처음 초기화 상태)
RED=1
BLUE=-1 #이분 그래프면 같은 Level에 있는 vertex들은 RED나 BLUE 중 하나로 결정됨
def bfs(q):
global false_flag
while q:
now_V=q.popleft() #큐에서 vertex 하나 뽑기
now_color=color[now_V] #현재 vertex의 색
for adj_v in adjacent_list[now_V]: #현재 vertex에 인접한 vertex들
if color[adj_v] == now_color: #★같은색이면 이분 그래프 아님
false_flag=1 #한번 이분 그래프 아니면 끝까지 아닌거다
if color[adj_v]==WHITE: #색칠된 적 없는(=방문한적없는) vertex면
color[adj_v]=now_color*(-1) #now_color가 RED일때 BLUE로, BLUE일때 RED로 칠함
q.append(adj_v) #큐에 넣어서 다음 인접한 vertex들 살핌
K=int(input()) #테스트 케이스
for _ in range(K):
V,E=map(int,sys.stdin.readline().split())
color=[WHITE]*(V+1)
adjacent_list = [[]for _ in range(V+1)] #index 1부터 쓰니까 V+1까지 초기화
false_flag=0 #이분 그래프가 아닌지 확인하기 위해
#그래프를 인접리스트로 저장
for _ in range(E):
v1,v2=map(int,sys.stdin.readline().split())
adjacent_list[v1].append(v2)
adjacent_list[v2].append(v1)
#연결그래프가 아닐 수 있으므로 다음과 같이
for i in range(1,V+1):
if color[i]==WHITE: #색칠된 적 없는(=방문한적없는) vertex면
q=deque([i])
color[i]=RED
bfs(q) #여기서 선택된 vertex와 경로가 있는 vertex들은 모두 색칠해줌
#★flag안쓰고 sys.exit(0)하면 프로그램 종료되서 뒤의 테스트케이스들 실행안됨
if false_flag==0:
print("YES")
else:
print("NO")
github.com/HoYoungChun/Algorithm_PS/blob/master/DFS%26BFS/BOJ_1707.py
HoYoungChun/Algorithm_PS
Baekjoon Online Judge, Programmers problem solving by Python, C++ - HoYoungChun/Algorithm_PS
github.com
'Algorithm > DFS&BFS' 카테고리의 다른 글
| [Python] 백준 5014번 : 스타트링크 (G5) - DFS&BFS 필수문제2 (0) | 2021.03.05 |
|---|---|
| [Python] 백준 2644번 : 촌수계산 (S2) - DFS&BFS 필수문제1 (0) | 2021.03.05 |
| [Python] 백준 7562번 : 나이트의 이동 (S2) - DFS&BFS단계별10 (0) | 2021.03.04 |
| [Python] 백준 2206번 : 벽 부수고 이동하기 (G4) - DFS&BFS단계별9 (0) | 2021.03.03 |
| [Python] 백준 1697번 : 숨바꼭질 (S1) - DFS&BFS단계별8 (0) | 2021.03.03 |