java – 需要一些帮助试图理解这个匹配代码的图形

代码可以在这里找到:
https://sites.google.com/site/indy256/algo/kuhn_matching2

更具体地说,我不确定我理解int n2是什么以及它是如何被使用的.

最佳答案 这里,对于
bipartite graphs,n1表示第一组(分区)的顶点数,n2表示第二组的顶点数.

例如.你会有一组工人和他们将要执行的一系列任务.在上面的例子中,有2个工人(比如约翰= 0和鲍勃= 1)和三个任务(比如,编码= 0,QA = 1,支持= 2).

约翰可以做编码和支持.鲍勃只能支持.他们都不能做QA(没有g [i] == 1)

然后算法遵循库恩的建议找到maximum matching(不要与最大匹配混淆).在我们的示例情况中,最大匹配具有两条边(例如,John->编码和Bob->支持).

上述算法不适用于加权二分图.

更新

为了适应问题的输入规则,需要进行以下操作. Simpy确保在g [x] = y:0< = x< n1和0 <= y< N2

public static void main(String[] args) {
  Scanner sc = new Scanner(System.in);
  int n1 = sc.nextInt();
  int n2 = sc.nextInt();
  int m = sc.nextInt();
  LinkedList<Integer>[] g = new LinkedList[n1];
  for (int j = 0; j < n1; j++) {
    g[j] = new LinkedList<Integer>();
  }
  int i = 0;
  while(i != m){
    int v = sc.nextInt();
    int v2 = sc.nextInt();
    if(v>=1 && v<=n1) { 
        //v belongs in first set 
        g[v-1].add(v2-n1-1);
    }else if(v>=n1+1 && v<=n1+n2) { 
        //v belongs in the second set, v2 into the first
        g[v2-1].add(v-n1-1);
    }
    i++;
  }
  System.out.println(maxMatching(g, n2));
}
点赞