• Hungray匈牙利算法


    一、解决问题

    在无权二分图中,使得两两匹配对数最多。

    例如:如果虚线表示暧昧关系,则男女能配多少对

    二、思想

    匈牙利算法的思想就是让。二分图右侧节点与之匹配的左侧节点如果能让出来,则移动左侧节点的匹配。否则寻找本次左侧节点的新匹配。

    尽可能多的去让出来。例如:

    • 男1与女a匹配。
    • 男2与女a有暧昧,但是男1让不出来。因此男2与女c匹配
    • 男3与女b匹配
    • 男4无人匹配
    • 男5与女b匹配,但是b让不出来,则5与d匹配

    三、Code

     1 package algorithm;
     2 
     3 import java.util.Arrays;
     4 
     5 public class HungaryTest {
     6 
     7     //妹子数目
     8     private static int m = 4;
     9     //男数目
    10     private static int n = 5;
    11 
    12     //男女是否暧昧, 即图是否链接
    13     private static boolean[][] line = new boolean[n][m];
    14 
    15     // 本次妹子是否匹配
    16     private static boolean[] used;
    17 
    18     //妹子属于谁
    19     private static int[] girl = new int[m];
    20 
    21     //最终匹配个数
    22     private static int all = 0;
    23 
    24     public static void init() {
    25         Arrays.fill(girl, -1);
    26         line[0][0] = true;
    27         line[1][0] = true;
    28         line[1][2] = true;
    29         line[2][1] = true;
    30         line[3][1] = true;
    31         line[4][1] = true;
    32         line[4][3] = true;
    33     }
    34 
    35     private static boolean find(int x) {
    36         for (int i = 0; i < m; i++) {
    37             if (line[x][i] && !used[i]) {
    38                 used[i] = true;
    39                 if (girl[i] == -1 || find(girl[i])) {
    40                     girl[i] = x;
    41                     return true;
    42                 }
    43             }
    44         }
    45         return false;
    46     }
    47 
    48     public static void main(String[] args) {
    49         init();
    50         for (int i = 0; i < n; i++) {
    51             used = new boolean[m];
    52             find(i);
    53         }
    54 
    55         for(int i = 0; i < m; i++){
    56             if(girl[i] != -1) System.out.println("girl " + i + " boy " + girl[i]);
    57         }
    58     }
    59 }

    结果:

  • 相关阅读:
    mac控制台快捷键
    idc函数大全
    idc指令相关
    idc交叉引用
    ida脚本函数
    2025年全球网络安全市场规模将达到30万亿美元
    是黑客驱动着汽车网络安全市场的趋势?听听大佬们怎么说
    不修复!你的设备会被黑客远程控制,专家警告修补这个漏洞
    共抗疫情!科技人员积极抗击”冠状病毒“大流行
    警惕黑客威胁汽车,车联网如何保证安全?
  • 原文地址:https://www.cnblogs.com/ylxn/p/12255209.html
Copyright © 2020-2023  润新知