이분 매칭
시간 복잡도 : O(E*sqrt(V))
visit : 방문 여부 확인
bs : 현재 노드가 연결된 노드
ex) bs[a]=b; 라면, a와 b가 연결된 상태이다.
기본 코드
bool dfs(int cur)
{
if (visite[cur])
return 0;
visite[cur] = 1;
for (int i = 0; i < node[cur].size(); i++)
{
int next = node[cur][i];
if (!bs[next] || dfs(bs[next]))
{
bs[next] = cur;
return 1;
}
}
return 0;
}
int binary_match()
{
int ret = 0;
for (int i = 1; i <= n; i++)
{
fill_n(&visite[0], MAX, 0);
if (dfs(i))ret++;
}
return ret;
}
기본 예제
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#define MAX 5005
#define INF 987654321
#define MOD 31991
#pragma warning(disable:4996)
using namespace std;
typedef long long ll;
typedef pair<int, int> pi;
int n, m, bs[MAX];
bool visite[MAX];
vector<vector<int>> node;
bool dfs(int cur)
{
if (visite[cur])
return 0;
visite[cur] = 1;
for (int i = 0; i < node[cur].size(); i++)
{
int next = node[cur][i];
if (!bs[next] || dfs(bs[next]))
{
bs[next] = cur;
return 1;
}
}
return 0;
}
int binary_match()
{
int ret = 0;
for (int i = 1; i <= n; i++)
{
fill_n(&visite[0], MAX, 0);
if (dfs(i))ret++;
}
return ret;
}
int main()
{
scanf("%d %d", &n, &m);
node.resize(n + 1);
for (int i = 1; i <= m; i++)
{
int a, b;
scanf("%d%d", &a,&b);
node[a].push_back(b);
}
printf("%d", binary_match());
return 0;
}'IT > 알고리즘 및 자료구조' 카테고리의 다른 글
| [알고리즘 정리]네트워크 플로우(Network Flow) 알고리즘_에드몬드 카프 알고리즘(Edmonds-Karp algorithm) (0) | 2018.10.03 |
|---|---|
| [알고리즘 정리] 위상 정렬 (0) | 2018.09.30 |
| [알고리즘 정리] 세그먼트 트리 (0) | 2018.09.17 |
| [알고리즘 정리] 이분 탐색 (0) | 2018.09.14 |
| [알고리즘 정리] 그라함 알고리즘(Graham’s scan) 알고리즘 (0) | 2018.08.26 |