匈牙利
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int N = 510, M = 100010;
int ne[M], e[M], h[M], match[N];
int len, n1, n2, m;
bool vis[N];
void add(int a, int b)
{
e[len] = b;
ne[len] = h[a];
h[a] = len++;
}
bool find(int x)
{
for (int i = h[x]; ~i; i = ne[i])
{
int y = e[i];
if (!vis[y])
{
vis[y] = true;
if (match[y] == 0 || find(match[y]))
{
match[y] = x;
return true;
}
}
}
return false;
}
int main()
{
cin.tie(0);
ios::sync_with_stdio(false);
memset(h, -1, sizeof h);
cin >> n1 >> n2 >> m;
for (int i = 1; i <= m; i++)
{
int x, y;
cin >> x >> y;
add(x, y);
}
int ans = 0;
for (int i = 1; i <= n1; i++)
{
memset(vis, false, sizeof vis);
if (find(i))
ans++;
}
cout << ans << endl;
return 0;
}
染色法
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 2e5 + 10;
int ne[N], e[N], h[N], color[N];
int n, m, len;
void add(int a, int b)
{
e[len] = b;
ne[len] = h[a];
h[a] = len++;
}
bool dfs(int x, int c)
{
color[x] = c;
for (int i = h[x]; ~i; i = ne[i])
{
int y = e[i];
if (!color[y])
if (!dfs(y, 3 - c))
return false;
if (color[y] == color[x])
return false;
}
return true;
}
int main()
{
cin.tie(0);
ios::sync_with_stdio(false);
memset(h, -1, sizeof h);
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
int a, b;
cin >> a >> b;
add(a, b);
add(b, a);
}
bool flag = true;
for (int i = 1; i <= n; i++)
if (!color[i])
if (!dfs(i, 1))
flag = false;
if (flag)
cout << "Yes" << endl;
else
cout << "No" << endl;
return 0;
}