我试图使用匈牙利算法的以下实现: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)
,以便该算法具有亚完美匹配的内容。这有时会起作用,并且当它出现时,它会像我想要的那样创建一些相互配对,但是某些顶点不会配对。并且仍然存在分段错误。
那么,有没有什么办法来解决这个问题呢?还有其他更适合的算法吗?
匈牙利语算法计算加权双方匹配。你正在尝试做一些不同的事情,而这完全不清楚。 – tmyklebu 2014-12-13 03:39:52
我仍然试图做这样的匹配。例如,如果我有六个人a,b,c,d,e,f和我被赋予了每个可能配对的“成本”,我想要找到如何将这六个人分成三对成本。它就像是一个加权的二部分匹配两个相等的集合,约束配对是相互的。有没有不同的算法呢? – 2014-12-13 04:53:24
这是nonbipartite匹配。是的,有一个有效的算法,但它不是双方匹配。 – tmyklebu 2014-12-13 17:39:20