代码可以在这里找到:
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));
}