匈牙利算法主要用来解决两个问题:求二分图的最大匹配数最小点覆盖数
    最大匹配问题相当于,假如你是红娘,可以撮合任何一对有暧昧关系的男女,那么你最多能成全多少对情侣
    我们从B1看起(男女平等,从女生这边看起也是可以的),他与G2有暧昧,那我们就先暂时把他与G2连接(注意这时只是你作为一个红娘在纸上构想,你没有真正行动,此时的安排都是暂时的)。
    v2-997b432a51e01b8405275f1b4818f4b8_1440w.jpg
    来看B2,B2也喜欢G2,这时G2已经“名花有主”了(虽然只是我们设想的),那怎么办呢?我们倒回去看G2目前被安排的男友,是B1,B1有没有别的选项呢?有,G4,G4还没有被安排,那我们就给B1安排上G4。
    v2-84370dc7e8a5510007c941d35b737c0e_1440w.jpg
    然后B3,B3直接配上G1就好了,这没什么问题。至于B4,他只钟情于G4,G4目前配的是B1。B1除了G4还可以选G2,但是呢,如果B1选了G2,G2的原配B2就没得选了。我们绕了一大圈,发现B4只能注定单身了,可怜。(其实从来没被考虑过的G3更可怜)
    v2-634b61583dddfbae732af01110bce632_1440w.jpg

    1. #include <cstdio>
    2. #include <cstring>
    3. int Map[205][205], p[205], vis[205], N, T;
    4. bool match(int i){
    5. for (int j = 1; j <= N; ++j){
    6. if (Map[i][j] && !vis[j]){
    7. // 访问过的标记为1
    8. vis[j] = 1;
    9. // 递归查询右图,匹配成功立刻返回true
    10. if (p[j] == 0 || match(p[j])){
    11. p[j] = i;
    12. return true;
    13. }
    14. }
    15. }
    16. return false;
    17. }
    18. int Hungarian(){
    19. int cnt = 0;
    20. for (int i = 1; i <= N; ++i){
    21. memset(vis, 0, sizeof(vis));
    22. if (match(i))
    23. cnt++;
    24. }
    25. return cnt;
    26. }