[파이썬] 이분 그래프 (Bipartite Graph)의 판별과 활용

이분 그래프는 그래프의 정점들을 두 개의 그룹으로 나눌 수 있는 그래프입니다. 각 그룹 내의 정점들간에는 간선이 존재하지 않고, 서로 다른 그룹에 속한 정점들 사이에만 간선이 존재합니다. 이분 그래프는 많은 분야에서 사용되며, 특히 네트워크 흐름, 자원 할당, 일정 스케줄링 등의 문제를 해결하는 데에 유용합니다.

이분 그래프 판별 알고리즘

이분 그래프를 판별하는 가장 간단한 방법은 DFS (깊이 우선 탐색)를 활용하는 것입니다. 다음은 이분 그래프를 판별하는 알고리즘의 예시 코드입니다.

def is_bipartite(graph, start):
    color = {}  # 정점의 색깔을 저장하는 딕셔너리
    stack = [(start, 0)]

    while stack:
        node, c = stack.pop()

        if node in color:
            # 이미 색깔이 지정된 정점인 경우
            if color[node] != c:
                return False
            continue

        color[node] = c

        for neighbor in graph[node]:
            stack.append((neighbor, 1 - c))
    
    return True

위의 코드에서 graph는 인접 리스트로 표현된 그래프를 나타내며, start는 시작 정점을 의미합니다. 이 알고리즘은 DFS를 통해 그래프를 탐색하면서 각 정점에 색깔을 지정합니다. 매 정점마다 인접한 정점들을 확인하면서 같은 색깔을 가진 정점을 만나면 이분 그래프가 아니므로 False를 반환합니다. 최종적으로 그래프를 모두 탐색한 후에는 이분 그래프임을 확인할 수 있으므로 True를 반환합니다.

이분 그래프의 활용

네트워크 흐름 (Network Flow)

네트워크 흐름 문제에서 이분 그래프는 매우 중요한 역할을 합니다. 네트워크 흐름 문제는 어떤 자원이 하나의 출발지에서 목적지로 흐르는 상황을 모델링한 그래프 문제입니다. 이 때 이분 그래프를 사용하면 출발지와 목적지를 서로 다른 그룹으로 분류할 수 있습니다. 이분 그래프를 활용하여 네트워크 흐름을 최적화하는 알고리즘인 최대 유량 (Maximum Flow) 알고리즘을 구현할 수 있습니다.

자원 할당 (Resource Allocation)

자원 할당 문제에서도 이분 그래프는 유용하게 사용됩니다. 예를 들어, 여러 작업을 여러 작업자에게 할당해야 하는 경우, 이분 그래프를 활용하여 작업과 작업자를 서로 다른 그룹으로 분류할 수 있습니다. 이분 그래프를 활용하는 자원 할당 알고리즘을 구현하면 효율적이고 공정한 자원 할당을 할 수 있습니다.

일정 스케줄링 (Job Scheduling)

일정 스케줄링 문제에서도 이분 그래프가 유용합니다. 여러 작업을 여러 시간대에 할당하는 경우, 이분 그래프를 통해 작업과 시간대를 나눌 수 있습니다. 이분 그래프를 활용하여 일정 스케줄링을 최적화하는 알고리즘을 구현하면 작업과 시간대의 조합으로 이루어진 최적의 일정을 구할 수 있습니다.

결론

이분 그래프는 그래프 분석과 다양한 문제에 널리 사용되는 중요한 개념입니다. 간단한 DFS 알고리즘을 활용하여 이분 그래프를 판별할 수 있고, 네트워크 흐름, 자원 할당, 일정 스케줄링 등 다양한 문제에서 이분 그래프를 활용하여 효율적이고 최적의 해답을 구할 수 있습니다.