可以在此处找到代码:https://sites.google.com/site/indy256/algo/kuhn_matching2
更具体地说,我不确定我理解int n2是什么以及如何使用它。
答案 0 :(得分:2)
这里,对于bipartite graphs,n1
表示第一组(分区)的顶点数,n2
表示第二组的顶点数。
例如。你会有一组工人和他们将要执行的一系列任务。在上面的示例中,有2名工作人员(比如John=0
和Bob=1
)和3个任务(例如coding=0
,QA=1
,support=2
)。
约翰可以做编码和支持。鲍勃只能支持。他们都不能做QA(没有g [i] == 1)
然后该算法遵循库恩的建议,找到maximum matching(不要与最大匹配混淆)。在我们的示例中,最大匹配具有两条边(例如John->coding
和Bob->support
)。
上述算法不适用于加权二分图。
<强>更新强>
为了适应问题的输入规则,需要进行以下操作。 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));
}