简单二分图板子
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
const int MaxN = 1000;
using namespace std;
struct node{
int x , y;
}a[MaxN + 5] , b[MaxN + 5];
vector<int> G[MaxN + 5];
bool vis[MaxN + 5];
int n , match[MaxN + 5];
bool dfs(int x)
{
vis[x] = true;//当前点匹配好了
for(int i = 0 ; i < G[x].size() ; i++){
int v = G[x][i] , w = match[v];
if(w < 0 || !vis[w] && dfs(w)){//若v点没有匹配,||之前匹配的还有其他的点可以匹配
match[v] = w;//就挨个匹配嘛
match[x] = v;
return true;//找到了
}
}
return false;
}
void build(int u , int v)
{
G[u].push_back(v);
G[v].push_back(u);
}
void Init()
{
一顿建图
}
int matching()//匹配个数
{
for(int i = 1 ; i <= MaxN ; i++) G[i].clear();
int ans = 0;
memset(match , -1 , sizeof(match));
for(int i = 1 ; i <= n ; i++){
if(match[i] == -1){
memset(vis , 0 , sizeof(vis));
if(dfs(i)) ans++;
}
}
return ans;
}