이분 매칭(Bipartite Matching)

2021. 11. 2. 13:52·Algorithm/알고리즘 이론

이전 게시글인 <네트워크 플로우(Network Flow)>에 이어지는 알고리즘 개념 글입니다 

https://codingsmu.tistory.com/109

 

이분 매칭(Bipartite Matching)이란?

네트워크 플로우의 개념중에서 이분 그래프(Bipartite Graph)에서의 최대 유량(maximum flow)을 구하는 경우로, 에지의 용량(capacity)이 전부 1인 이분 그래프에서의 최대유량(maximum flow)을 구하는 문제는 이분 그래프에서의 최대 매칭(maximium matching)과 동치이다. 이때 매칭은, 서로 다른 그룹에 놓인 두 정점을 짝지어주는 의미로 이분그래프에서 최대 매칭을 최대 유량 알고리즘인 디닉 혹은 에드몬드 카프 알고리즘을 이용해 구해줄 수 있으나, DFS를 이용하여 O(V*E)시간에 쉽게 구현할 수 있다

 

이분 그래프(Bipartite Graph)란?

파란색 정점과 빨간색 정점을 각 좌측, 우측으로 재배열한 그래프를 보면, 두 정점들끼리는 어떠한 에지도 존재하지 않다. 이렇게 정점을 두 그룹으로 나누었을 때, 모든 간선에 연결 된 두 정점이 서로 다른 그룹에 존재하는 그래프를 이분 그래프라고 한다

 

이분 매칭 알고리즘 : DFS(O(V*E))

  1. 노드1에서 DFS
    • DFS 결과, A와 매칭
  2. 노드2에서 DFS 
    • 노드2에서는 A 방문 -> 이미 <노드1-A>이 매칭된 상황
    • 노드1이 B로 갈 수 있으므로 노드1이 양보
    • 노드2와 A 매칭, 노드1이 B와 매칭
  3. 노드3에서 DFS
    • 노드3에서 B 방문 -> 이미 <노드1-B>이 매칭된 상황
    • 노드1이 더 갈 노드가 없으므로 양보 불가
    • 노드3에서 C 방문 -> 노드3과 C 매칭
  4. 노드4에서 DFS
    • 노드4에서 D 방문 -> 노드4과 D 매칭
  5. 노드 5에서 DFS
    • 노드5에서 C 방문 -> 이미 <노드3-C>가 매칭된 상황
    • 노드3이 더 갈 노드가 없으므로 양보 불가능
    • 이분매칭 종료 -> 최대매칭은 4임

구현 코드(C++)

#include <iostream>
#include <vector>
#include <memory.h>

using namespace std;

int N, M;
int match[MAX];
bool visited[MAX];
vector<vector<int>> v(MAX);

bool dfs(int cur);

int main(void){
    int ans = 0;
    cin >> N >> M;
    
    // intialize bipartite graph
    for(int i = 1; i <= N; i++){
        int j;
        cin >> j;
        for(int k = 1; k <= j; k++){
            int tmp;
            cin >> tmp;
            v[i].push_back(tmp);
        }
    }
    // answer is the number of maximum matchings
    for(int i = 1; i <= N; i++){
        memset(visited, 0, sizeof(visited));
        if (dfs(i))
            ans++;
    }
    cout << ans << '\n';
    return 0;
    
}
bool dfs(int cur){
    visited[cur] = true;
    for(auto there:v[cur]){
        int work = match[there];
        if (!work || (!visited[work] && dfs(work))){ 
            match[there] = cur;
            return 1;
        }
    }
    return 0;
}

 

반응형

'Algorithm > 알고리즘 이론' 카테고리의 다른 글

[그래프 이론] 플로이드-워셜(Floyd-Warshall) 알고리즘  (0) 2022.01.02
네트워크 플로우(Network Flow)  (2) 2021.11.03
최소 공통 조상(Lowest Common Ancestor)  (0) 2021.10.04
단절점(Articulation Point), 단절선(Articulation Bridge)  (0) 2021.09.30
강한연결요소 : Strongly Connected Component  (0) 2021.09.05
'Algorithm/알고리즘 이론' 카테고리의 다른 글
  • [그래프 이론] 플로이드-워셜(Floyd-Warshall) 알고리즘
  • 네트워크 플로우(Network Flow)
  • 최소 공통 조상(Lowest Common Ancestor)
  • 단절점(Articulation Point), 단절선(Articulation Bridge)
계속지나가기
계속지나가기
NLP Engineer
  • 계속지나가기
    코딩스뮤
    계속지나가기
  • 전체
    오늘
    어제
    • 코딩스뮤:)
      • Algorithm
        • 백준 문제풀이
        • 프로그래머스 문제풀이
        • 알고리즘 이론
        • 자료구조
        • SW Expert Academy
      • 인공지능(AI)
        • LLMs
        • 자연어처리(NLP)
        • 컴퓨터비전(CV)
        • 딥러닝(DL)
        • 머신러닝(ML)
        • 인공지능기초수학
        • 선형대수학
      • 컴퓨터 세팅
      • Computer Science
        • 유닉스프로그래밍
        • 프로그래밍언어론
        • 디자인패턴
        • 클린코드
        • SW 영어
        • 리눅스
        • 논리회로
      • Server
        • Docker
      • 바이브 코딩
        • 클로드 코드
  • 블로그 메뉴

    • 홈
    • Who Am I(CV)
    • 태그
  • 링크

    • 깃허브 주소
  • 공지사항

  • 인기 글

  • 태그

    ComputerVision
    기계학습
    경사하강법
    DigitalImageProcessing
    MaximumFlow
    machinelearning
    선형회귀
    디지털이미지처리
    머신러닝
    지도학습
    에지검출
    손실함수
    f1-score
    언어모델
    최대유량
    LM
    DIP
    패턴인식
    결정경계
    파이썬 클린코드
    컴퓨터비전
    비용함수
    군집화
    비지도학습
    SIFT
    ML
    네트워크플로우
    networkflow
    알고리즘
    NLP
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
계속지나가기
이분 매칭(Bipartite Matching)

티스토리툴바