#include <iostream>
#include <istream>
#include <sstream>
#include <vector>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include <chrono>
#include <ctime>
#include <cmath>
#include <cctype>
#include <string>
#include <cstdio>
#include <iomanip>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <iterator>
using namespace std;
inline int read(int& x) {
char ch = getchar();
int f = 1; x = 0;
while (ch > '9' || ch < '0') { if (ch == '-')f = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { x = (x << 1) + (x << 3) + ch - '0'; ch = getchar(); }
return x * f;
}
const int maxn = 1e3 + 7;
vector<int> arr[maxn];
int n, m, e,match[maxn],vis[maxn];
bool dfs(int x) {
for (int i = 0; i < arr[x].size(); i++) {
int nx = arr[x][i];
if (vis[nx])continue;
vis[nx] = 1;
if (match[nx] == 0 || dfs(match[nx])) {
match[nx] = x;
return true;
}
}
return false;
}
int main()
{
int a, b,ans = 0;
cin >> n >> m >> e;
for (int i = 0; i < e; i++) {
cin >> a >> b;
arr[a].push_back(b);
}
for (int i = 1; i <= n; i++) {
memset(vis, 0, sizeof(vis));
if (dfs(i)) {
++ans;
}
}
cout << ans << endl;
return 0;
}
二分图最大匹配
最新推荐文章于 2024-09-02 20:13:36 发布