我正在尝试实现一个函数来解决匈牙利算法,我认为我对该算法有误解。
出于测试目的,我正在使用来自谷歌的这个 c++代码,它应该可以工作。
但是当我测试这个 14x11 矩阵时,它说不可能解决:
[ 0 0 0 0 0 0 0 0 0 0 0 ]
[ 53 207 256 207 231 348 348 348 231 244 244 ]
[ 240 33 67 33 56 133 133 133 56 33 33 ]
[ 460 107 200 107 122 324 324 324 122 33 33 ]
[ 167 340 396 340 422 567 567 567 422 442 442 ]
[ 167 367 307 367 433 336 336 336 433 158 158 ]
[ 160 20 37 20 31 70 70 70 31 22 22 ]
[ 200 307 393 307 222 364 364 364 222 286 286 ]
[ 33 153 152 153 228 252 252 252 228 78 78 ]
[ 93 140 185 140 58 118 118 118 58 44 44 ]
[ 0 7 22 7 19 58 58 58 19 0 0 ]
[ 67 153 241 153 128 297 297 297 128 39 39 ]
[ 73 253 389 253 253 539 539 539 253 36 36 ]
[ 173 267 270 267 322 352 352 352 322 231 231 ]
用于创建数组的 C++ 代码:(如果有人想使用我提供的 C++ 示例对其进行测试)
int r[14*11] ={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 207, 256, 207, 231, 348, 348, 348, 231, 244 , 244, 240, 33, 67, 33, 56, 133, 133, 133, 56, 33, 33, 460, 107, 200, 107, 122, 324, 324, 324, 122, 33, 33, 167, 340 , 396, 340, 422, 567, 567, 567, 422, 442, 442, 167, 367, 307, 367, 433, 336, 336, 336, 433, 158, 158, 160, 20, 37, 20, 31 , 70, 70, 70, 31, 22, 22, 200, 307, 393, 307, 222, 364, 364, 364, 222, 286, 286, 33, 153, 152, 153, 228, 252, 252, 252 , 228, 78, 78, 93, 140, 185, 140, 58, 118, 118, 118, 58, 44, 44, 0, 7, 22, 7, 19, 58, 58, 58, 19, 0, 0 , 67, 153, 241, 153, 128, 297, 297, 297, 128, 39, 39, 73, 253, 389, 253, 253, 539, 539, 539, 253, 36, 36, 173, 267, 270 , 267, 322, 352, 352, 352, 322, 231,231};
如果我运行我的实现以减少零的数量(这样它们就可以被最少的行数所覆盖——顶部提供的wikihow链接中的第9步——)我得到以下矩阵,我必须在其中找到唯一的 0 组合行和列。
问题是无法解决,因为第 10 列和第 11 列(粗体)各只有一个 0,并且位于同一行。
第 1 行:[ 240 140 225 140 206 339 339 339 206 215 215 0 0 0 ]
第 2 行:[254 0 37 0 43 58 58 58 43 38 38 67 67 67]
第 3 行:[0 107 158 107 151 206 206 206 151 182 182 0 0 0]
第 4 行:[0 253 245 253 304 235 235 235 304 402 402 220 220 220]
第 5 行:[300 27 56 27 11 0 0 0 11 0 0 227 227 227]
第 6 行:[300 0 145 0 0 230 230 230 0 284 284 227 227 227]
第 7 行:[80 120 188 120 176 269 269 269 176 193 193 0 0 0]
第 8 行:[207 0 0 0 151 143 143 143 151 96 96 167 167 167]
第 9 行:[229 9 95 9 0 110 110 110 0 159 159 22 22 22]
第 10 行:[147 0 40 0 148 221 221 221 148 171 171 0 0 0]
第 11 行:[240 133 203 133 187 282 282 282 187 215 215 0 0 0]
第 12 行:[189 3 0 3 94 58 58 58 94 192 192 16 16 16]
第 13 行:[367 87 36 87 153 0 0 0 153 379 379 200 200 200]
第 14 行:[194 0 82 0 11 115 115 115 11 112 112 127 127 127]
这种方法有什么限制吗?或者只是我,对算法的实现不好?在这种情况下,为什么“应该工作”的例子也不起作用?
任何建议将不胜感激,或者如果您知道任何技巧或建议来帮助找到覆盖零的最小行数,请告诉我。
提前致谢,