리뷰
https://www.acmicpc.net/problem/1298
n값이 작고 m값이 큰 이분매칭 문제
전역 변수
- N : 학생 배열의 최대 크기를 정의할 상수 변수
- M : 노트북 배열의 최대 크기를 정의할 상수 변수
- n : 학생의 수를 저장할 변수
- m : 노트북의 수를 저장할 변수
- ans : 정답을 저장할 변수
- mat : 노트북을 가진 학생의 번호를 저장할 배열
- v : 노트북을 참조한 시간을 저장할 배열
- t : 탐색 시간을 정의할 변수
함수
1. dfs
bool dfs(int node) {
if (v[node] == t) return false;
v[node] = t;
for (int next : edges[node]) {
if (!mat[next]) {
mat[next] = node;
return true;
}
}
for (int next : edges[node]) {
if (dfs(mat[next])) {
mat[next] = node;
return true;
}
}
return false;
}
학생들이 노트북을 최대로 소유할 수 있는 경우를 찾는 함수
문제풀이
- n, m에 값을 입력 받고, m개의 간선 정보를 edges벡터 배열에 추가해 준다.
- 1~n번 학생을 순회하며 t를 증가시킨 후 dfs함수에 i를 전달하여 리턴값이 true라면 ans를 증가시킨다.
- ans에 저장된 값을 출력해 준다.
트러블 슈팅
없음
참고 사항
없음
정답 코드
#include<iostream>
#include<vector>
using namespace std;
const int N = 101;
const int M = 5001;
int n, m, ans;
int mat[M];
int v[M];
int t;
vector<int> edges[N];
bool dfs(int node) {
if (v[node] == t) return false;
v[node] = t;
for (int next : edges[node]) {
if (!mat[next]) {
mat[next] = node;
return true;
}
}
for (int next : edges[node]) {
if (dfs(mat[next])) {
mat[next] = node;
return true;
}
}
return false;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
for (int i = 0; i < m; ++i) {
int a, b; cin >> a >> b;
edges[a].push_back(b);
}
for (int i = 1; i <= n; ++i) {
t++;
if (dfs(i)) ans++;
}
cout << ans;
}
728x90
'알고리즘 공부 > C++' 카테고리의 다른 글
[G2] 백준 17835번 면접보는 승범이네 C++ 다익스트라 (0) | 2025.04.12 |
---|---|
[P4] 백준 17481번 최애 정하기 C++ 이분 매칭, 해시맵 (1) | 2025.04.10 |
[P4] 백준 2188번 축사 배정 C++ 이분 매칭 (0) | 2025.04.08 |
[P4] 백준 11376번 열혈강호 2 C++ 이분 매칭 (1) | 2025.04.07 |
[P4] 백준 11375번 열혈강호 C++ 이분 매칭 (0) | 2025.04.06 |