농담곰담곰이의곰담농

1707. 이분 그래프

by 브이담곰

 

 

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

 

유형 : DFS

문제 풀이: 이분 그래프의 특징을 이용해 DFS로 탐색해 나가며 조건에 위배 될 경우 탐색을 종료시킨다.

- 방문하지 않은 노드를 탐색하려고 할 때 현재 노드와 다른 색으로 visited 배열에 저장을하고

- 방문 했던 노드를 탐색하려고 할 때는, 자신과 같고 이어져 있다면 이분 그래프가 아니므로 탐색을 종료한다.

 

 

주의 할 점

1. 재귀를 쓰면 시간 초과가 날 수 있다.

2. 모든 그래프가 연결 되어 있다는 보장이 없기 때문에, 전체 노드를 for문으로 탐색해야한다.

 

 

import sys
from collections import defaultdict
input=sys.stdin.readline # input함수 바꾸기

sys.setrecursionlimit(10**4) # 10^8 까지 늘림.

# 입력
# test case 개수
t_cnt = int(input())

def DFS(start,visited):
    stack = [start]
    visited[start] = 1 #설정한색으로 방문처리
    
    while stack: # 스택이 없을떄까지
        node = stack.pop()
        for next in Graph[node]:
            if visited[next] == 0: # 방문안한곳은 현재와 다른 색으로 칠해주고 이동
                visited[next] = - visited[node] # 반대색으로 설정
                stack.append(next)
            elif visited[next] == visited[node]: #연결되어잇는 노드인데 같은 색이라면?!?! 이분 그래프가 아니다.
                return False
            
    return True

# V, E
for cnt in range(t_cnt):
    V, E = map(int, input().split())
    # V 정점개수
    # E 간선개수
    
    # 그래프 초기화.
    Graph = defaultdict(list)
    visited = [0] * (V + 1)  # 0은 방문 X, 1과 2는 다른색이자 방문했다는 의미.
    result = True
    
    for n in range(E):
        u, v = map(int, input().split())
        
        Graph[u].append(v)
        Graph[v].append(u)
        
      
    for key in Graph.keys():
        if visited[key] == 0:
            # 근데 이미 result 가 false가 나오면 멈춰도 됨
            if not DFS(key,visited):
                result = False
                break

                     
    print("YES" if result else "NO")
        
# 반례 해결
# 1. 그래프가 연결되어있따는 보장이 없기때문에 for문 돌려서전체 그래프 확인해야힘
# 2. defaultdic으로 딕셔너리 초기화 최적화
    
# 반례 모음
"""https://www.acmicpc.net/board/view/77198"""

 

 

'Coding Test > Baekjoon' 카테고리의 다른 글

2294. 동전  (0) 2024.07.18
2637. 장난감 조립  (0) 2024.07.18
11725. 트리의 부모 찾기  (0) 2024.07.18
1197. 최소 스패닝 트리  (0) 2024.07.18
5639. 이진 검색 트리  (0) 2024.07.18

블로그의 정보

농담곰담곰이의곰담농

브이담곰

활동하기