我正在尝试用C语言实现匈牙利语算法.
我有矩阵:
35 0 0 0
0 30 0 5
55 5 0 10
0 45 30 45
而且我要达到我必须找到覆盖所有零的最小线数的阶段(尽可能多地进行分配).显然,通过检查,这是第1列和第3列以及第1行.
第1行有三个零:选择任何(我选择第一个)并分配它
第2行:分配第一个零
第3行:分配第3个零
第4行未分配(因为唯一的零位于已经指定零的col中)
如果我按照上面的矩阵进行操作,我得到:
35 0' 0 0
0' 30 0 5
55 5 0' 10
0 45 30 45
零素数是指定的零.然后,按照下面的维基百科说明,我标记第4行(未分配的零),第1列(带有未分配的零的col),然后是第2行(标记为col的行为零).
所以这意味着命中全零的最小线是:
+--------
|
+--------
|
但这并没有达到零(2, 3).相关C代码:
for (i = 0; i < M->size; i++) {
for (j = 0; j < M->size; j++) {
if (M->values[i][j] == 0) {
if (assigned_cols[j] == 0) {
assigned_cols[j] = 1; // We've assigned something in this col
assigned_rows[i] = 1; // We've assigned something in this row.
marked_rows[i] = 0;
total--;
break; // Go to the next row
} else {
marked_cols[j] = 1; // Then there exists a zero in this col in an unassigned row
mark_col(M, j); // marks all elements in column j
total++;
}
}
}
}
此代码选择哪些零是零素数(分配零).
然后,此代码标记在新标记的列中具有分配的所有行:
for (i = 0; i < M->size; i++) {
if (marked_cols[i] == 1) {
for (j = 0; j < M->size; j++) {
//iterating through rows
if (M->values[j][i] == 0) {
// then (j,i) is a zero in a marked col
// mark the row
if (marked_rows[j] != 1) {
total++;
marked_rows[j] = 1;
}
break; // no need to continue more
}
}
}
}
但是这个(以及维基百科的解释)在我的矩阵上面失败了.怎么会?