ebson

boj.kr/1707 이분 그래프 (gold4) 파이썬 풀이 본문

ALGORITHM STUDY WITH PYTHON/BFS | DFS

boj.kr/1707 이분 그래프 (gold4) 파이썬 풀이

ebson 2023. 5. 1. 17:38

시작노드를 인덱스로 하고 인접노드를 요소로 갖는 1. graph 리스트와

이분 그래프 여부를 판단하는 2. 플래그 변수를 사용한 풀이이다.

3. sys.stdin.readline 으로 빠른 입력 받기를 사용해야 시간초과 나지 않는다.

 

 

풀이1 - DFS 활용

import sys
sys.setrecursionlimit(10**6)
N = int(input())

input = sys.stdin.readline
def dfs(node):
    global flag
    for neighbor in graph[node]:
        if (visited[neighbor] == -1):
            visited[neighbor] = 1 if (visited[node] == 2) else 2
            dfs(neighbor)
        else:
            if visited[node] == visited[neighbor]:
                flag = False
                return


for _ in range(N):
    flag = True
    V, E = map(int, input().split())
    visited = [-1] *(V+1)
    graph = [[] for _ in range(V+1)]
    for _ in range(E):
        start, end = map(int, input().split())
        graph[start].append(end)
        graph[end].append(start)

    for i in range(1, V+1):
        if (visited[i] == -1):
            visited[i] = 1
            dfs(i)
            if (flag == False):
                break

    print("YES" if flag else "NO")

 

풀이2 - BFS 활용

import sys
input = sys.stdin.readline
from collections import deque

def bfs(node):
    dq = deque()
    dq.append(node)
    while dq:
        cur = dq.popleft()
        for nxt in graph[cur]:
            if visited[nxt] == -1:
                visited[nxt] = 1 if visited[cur] == 2 else 2
                dq.append(nxt)
            elif visited[nxt] == visited[cur]:
                return False
    return True

T = int(input())
for _ in range(T):
    V, E = map(int, input().split())
    graph = [[] for _ in range(V+1)]
    for _ in range(E):
        s, e = map(int, input().split())
        graph[s].append(e)
        graph[e].append(s)
    visited = [-1 for _ in range(V+1)]
    flag = True
    for node in range(1, V+1):
        if visited[node] == -1:
            if not bfs(node):
                flag = False

    print("YES" if flag else "NO")
Comments