계속지나가기
코딩스뮤
계속지나가기
전체 방문자
오늘
어제
  • 코딩스뮤:)
    • Algorithm
      • 백준 문제풀이
      • 프로그래머스 문제풀이
      • 알고리즘 이론
      • 자료구조
      • SW Expert Academy
    • 인공지능(AI)
      • LLMs
      • 자연어처리(NLP)
      • 컴퓨터비전(CV)
      • 딥러닝(DL)
      • 머신러닝(ML)
      • 인공지능기초수학
      • 선형대수학
    • 컴퓨터 세팅
    • Computer Science
      • 유닉스프로그래밍
      • 프로그래밍언어론
      • 디자인패턴
      • 클린코드
      • SW 영어
      • 리눅스
      • 논리회로
    • Server
      • Docker

블로그 메뉴

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

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
계속지나가기

코딩스뮤

이분 매칭(Bipartite Matching)
Algorithm/알고리즘 이론

이분 매칭(Bipartite Matching)

2021. 11. 2. 13:52
반응형

이전 게시글인 <네트워크 플로우(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

    티스토리툴바