二分图匹配思想说白了就是先从未匹配的点出发,到另一个未匹配的点结束,中间的点是未匹配 匹配的点交叉,即:未匹配 匹配 未匹配 匹配.........未匹配,这样每次这样的路都是未匹配的比匹配的点多一个,然后把未匹配的变成匹配的点,匹配的变成未匹配的,每次匹配的点都多一个,直到没有这样的道路为止
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <vector>
using namespace std;
const int maxn = 500 + 7;
int n, m;
vector<int> G[maxn];
int d[maxn], vis[maxn];
bool dfs(int u) {
for(int i = 0; i < G[u].size(); ++i) {
int v = G[u][i];
if(!vis[v]) {
vis[v] = 1;
if(d[v] == -1 || dfs(d[v])) {
d[u] = v;
d[v] = u;
return true;
}
}
}
return false;
}
int abc() {
int res = 0;
memset(d, -1, sizeof(d));
for(int i = 1; i <= n; ++i) {
memset(vis, 0, sizeof(vis));
if(d[i] == -1 && dfs(i)) ++res;
}
return res;
}
int main() {
int u, v;
scanf("%d%d", &n, &m);
for(int i = 0; i < m; ++i) {
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
int ans = abc();
printf("%d\n", ans);
return 0;
}
/**
9 8
1 6
2 5
2 9
3 6
3 7
4 6
4 8
4 9
**/