record logo record

이분 매칭(Bipartite Matching) 이란?

이분 매칭(Bipartite Matching) 알고리즘의 특징

이분 매칭(Bipartite Matching)의 알고리즘 예시

Source Code

#include <iostream>
#include <vector>
#define MAX 101

using namespace std;

vector<int> a[MAX];  // 각 정점과 연결된 간선 정보 
int d[MAX]; // 점유 하고있는 노드의 정보 
bool c[MAX]; // 특정 정점을 처리했는지 여부 
int n = 3, m; // m 간선의 개수

// 매칭에 성공한 경우 True, 실패한경우 false
bool dfs(int x) {
	// 연결된 모든 노드에 대해서 들어갈 수 있는 시도  
	for(int i = 0; i < a[x].size(); i++){
		int t = a[x][i];
		// 이미 처리한 노드는 더 이상 볼 필요가 없음
		if(c[t]) continue;
		c[t] = true;
		// 비어있거나 점유 노드에 더 들어갈 공간이 있는 경우
		if(d[t] == 0 || dfs(d[t])){
			d[t] = x;
			return true;
		}
	}
	return false;
}

int main(void) {
	a[1].push_back(1);
	a[1].push_back(2);
	a[1].push_back(3);
	
	a[2].push_back(1);
	a[3].push_back(2);
	
	int count = 0;
	for(int i = 1; i <= n; i++){
		fill(c, c + MAX, false);
		if(dfs(i)) count++;
	}
	printf("%d 개의 매칭이 이루어졌습니다. \n", count);
	for(int i = 1; i < MAX; i++){
		if(d[i] != 0) {
			printf("%d -> %d \n", d[i], i);
		}
	}
	return 0;
}

이분 매칭(Bipartite Matching)의 시간복잡도

깊이 우선 탐색(DFS)를 이용해 이분 매칭을 간단히 풀 때

시간 복잡도는 O(V * E) 이다. 이 방법은 가장 빠른 속도의 알고리즘은 아니지만 구현이 가장 간단하고 쉽다는 점에서 많이 사용된다.

관련된 Post

References