裸的匈牙利算法求二分图
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <queue>
#include <map>
using namespace std;
#define INF 1e9
#define maxn 110
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define mset(x) memset(x,0,sizeof(x))
int n, m;
int a[maxn], b[maxn];
vector<int> G[maxn];
bool vis[maxn];
int link[maxn];
bool find(int u)
{
for(int i=0; i<G[u].size(); i++)
{
int v = G[u][i];
if(!vis[v])
{
vis[v] = true;
if(link[v]==-1 || find(link[v]))
{
link[v] = u;
return true;
}
}
}
return false;
}
int hungary()
{
int res = 0;
memset(link, -1, sizeof(link));
rep(i,1,n){
mset(vis);
if(find(i)) res++;
}
return res;
}
int main(){
// freopen("a.txt","r",stdin);
// freopen(".out","w",stdout);
cin>>n;
rep(i,1,n) scanf("%d", &a[i]);
cin>>m;
rep(i,1,m) scanf("%d", &b[i]);
rep(i,1,n) G[i].clear();
rep(i,1,n){
rep(j,1,m){
if(abs(a[i] - b[j]) <= 1)
G[i].push_back(j);
}
}
printf("%d\n", hungary());
return 0;
}