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 }

结果:

原文地址:https://www.cnblogs.com/ylxn/p/12255209.html