需要一些帮助来尝试理解图形的匹配代码

时间:2013-11-26 03:45:32

标签: java graph-algorithm

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

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

1 个答案:

答案 0 :(得分:2)

这里,对于bipartite graphsn1表示第一组(分区)的顶点数,n2表示第二组的顶点数。 例如。你会有一组工人和他们将要执行的一系列任务。在上面的示例中,有2名工作人员(比如John=0Bob=1)和3个任务(例如coding=0QA=1support=2)。 约翰可以做编码和支持。鲍勃只能支持。他们都不能做QA(没有g [i] == 1)

然后该算法遵循库恩的建议,找到maximum matching(不要与最大匹配混淆)。在我们的示例中,最大匹配具有两条边(例如John->codingBob->support)。

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

<强>更新

为了适应问题的输入规则,需要进行以下操作。 Simpy确保在g[x]=y0 <= x < n10 <= 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));
}