ヒント1
各行と各列に頂点を持つグラフを考えてみましょう。
M[i,j] の行列に X がある場合、頂点 r_i と c_j の間にエッジがあるとします。
ヒント2
問題は、すべてのエッジ (つまり、すべての X) がセット内の少なくとも 1 つの頂点に接するように、一連の頂点を選択しようとしている (つまり、行と列を選択しようとしている) と言えます。
これを最小頂点被覆問題と呼びます。
ヒント3
一般に、頂点カバーは NP 完全ですが、この場合、グラフは 2 部になります。
ヒント4
最大フロー アルゴリズムを使用して 2 部最小頂点カバーを解決し、行と列の間の最大一致を計算できます。(詳細については、 Konig の定理を参照してください。)
解決
Python の場合:
import networkx as nx
M=[ [1,1,1],
[1,0,0],
[1,0,0] ]
G = nx.DiGraph()
for i,row in enumerate(M):
for j,c in enumerate(row):
if c:
G.add_edge('row'+str(i),'col'+str(j), capacity=1.0)
for i in range(len(M)):
G.add_edge('x','row'+str(i), capacity=1.0)
for j in range(len(M[0])):
G.add_edge('col'+str(j), 'y', capacity=1.0)
print nx.max_flow(G, 'x', 'y')