ハンガリーのアルゴリズムを実装しようとしていますが、ステップ 5で行き詰っています。基本的に、数値のn X n
行列が与えられた場合、行列のゼロがカバーされるように、垂直線と水平線の最小数を見つけるにはどうすればよいですか?
誰かがこの質問をこれと重複しているとマークする前に、そこに記載されている解決策は正しくなく、他の誰かがそこに投稿されたコードのバグに遭遇しました。
私はコードを探しているのではなく、これらの線を描くことができるコンセプトを探しています...
編集: 単純な (しかし間違った) 貪欲なアルゴリズムを投稿しないでください: この入力が与えられた場合:
(0, 1, 0, 1, 1)
(1, 1, 0, 1, 1)
(1, 0, 0, 0, 1)
(1, 1, 0, 1, 1)
(1, 0, 0, 1, 0)
明らかに列 2 を選択します (0-indexed):
(0, 1, x, 1, 1)
(1, 1, x, 1, 1)
(1, 0, x, 0, 1)
(1, 1, x, 1, 1)
(1, 0, x, 1, 0)
これで、2 つの「残りの」ゼロを持つ行 2 または列 1 を選択できます。col2 を選択すると、次のパスで間違ったソリューションになります。
(0, x, x, 1, 1)
(1, x, x, 1, 1)
(1, x, x, 0, 1)
(1, x, x, 1, 1)
(1, x, x, 1, 0)
正しい解決策は、4 行を使用することです。
(x, x, x, x, x)
(1, 1, x, 1, 1)
(x, x, x, x, x)
(1, 1, x, 1, 1)
(x, x, x, x, x)