c语言匈牙利算法,匈牙利算法 - 维基百科方法不适用于此示例

我正在尝试用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

}

}

}

}

但是这个(以及维基百科的解释)在我的矩阵上面失败了.怎么会?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值