匈牙利算法模板题,稍微注意一下先输入m,再输入n,而且是单向边。
code:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cmath>
#include <string>
#include <vector>
#include <stack>
#include <map>
#include <sstream>
#include <cstring>
#include <set>
#include <cctype>
#define IO \
ios::sync_with_stdio(false); \
// cin.tie(0); \
// cout.tie(0);
using namespace std;
typedef long long LL;
const int maxn = 5e2 + 5;
const int maxm = 1e6 + 10;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int inf = 0x3f3f3f3f;
const LL mod = 998244353;
int dis[8][2] = {0, 1, 1, 0, 0, -1, -1, 0};
int a[maxn][maxn], vis[maxn], match[maxn];
int k, n, m;
int DFS(int u)
{
for (int i = 1; i <= n; i++)
{
if (vis[i] == 0 && a[u][i] == 1)
{
vis[i] = 1;
if (match[i] == 0 || DFS(match[i]))
{
match[i] = u;
return 1;
}
}
}
return 0;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
IO;
int kase = 0;
while (cin >> k && k)
{
cin >> m >> n;
int x, y;
memset(a, 0, sizeof a);
memset(match, 0, sizeof match);
for (int i = 0; i < k; i++)
{
cin >> x >> y;
a[x][y] = 1; // 单向边
// a[y][x] = 1;
}
int ans = 0;
for (int i = 1; i <= m; i++)
{
memset(vis, 0, sizeof vis);
if (DFS(i))
ans++;
}
cout << ans << endl;
}
return 0;
}