我正在尝试使用匈牙利算法的以下实现:http: //community.topcoder.com/tc ?module=Static&d1=tutorials&d2=hungarianAlgorithm 。
我想修改这个算法,以便我可以将一组与自身配对。也就是说,如果“a”被分配给“b”,那么“b”也被分配给“a”。我唯一的想法是更改以下内容。
for (int cx = x, cy = y, ty; cx != -2; cx = prv[cx], cy = ty)
{
yx[cy] = cx;
xy[cx] = cy;
}
到以下:
for (int cx = x, cy = y, ty; cx != -2; cx = prv[cx], cy = ty)
{
yx[cy] = cx; yx[cx]=cy;
xy[cx] = cy; xy[cy]=cx;
}
这样算法总是检查配对是相互的路径。但是,我很确定这是错误的 - 代码通常会出现段错误。
我尝试通过更改if (max_match == n)
为更宽松的约束来解决问题,例如if (max_match >= n-1)
,以便算法满足于次完美匹配。这有时会起作用,当它起作用时,它会像我想要的那样创建一些相互对,但有些顶点是不成对的。并且仍然存在分段错误。
那么,有没有办法解决这个问题呢?还有其他更合适的算法吗?