【发布时间】:2016-06-13 07:17:19
【问题描述】:
我有数组 A 和 B。我必须找到数组 B 的最大匹配,这样 B[i] 的每个索引都可以与 A[j] 的任何索引匹配当且仅当 A[j ]!=B[i] 和 A[j] 之前没有匹配。例如:
A = {1 2 3 4}
B = {2 2 3 4}
Maximum Matching is 4 A[0]=B[3] , A[1]=B[2] , A[2]=B[1], A[3]=B[0]
A = {1 1 2}
B = {1 1 2}
Maximum Matching 2 A[0]=B[2] , B[1]=No Matching , A[2]=B[0]
我知道这是一个最大二分问题,但问题是 A=B 的长度。这将使我的二分解决方案超时。有没有更好的解决办法?
代码:
public static boolean is_match(int curr) {
for(int i = 0; i < A.length; i++) {
if(A[i] != curr && !V[i]) {
V[i] = true;
if(P[i] < 0 || is_match(P[i])) {
P[i] = curr;
return true;
}
}
}
return false;
}
我为每个 B 调用这个函数:
for(int i:B){
V = new boolean[n]
if(is_match(i)) match++;
}
如何改进我的解决方案?
【问题讨论】:
-
您正在实施什么二分算法?匈牙利算法还是最大流量版本?