Algorithm 将矩阵中的所有X以最少的步数更改为0

Algorithm 将矩阵中的所有X以最少的步数更改为0,algorithm,multidimensional-array,Algorithm,Multidimensional Array,我有一个问题,我必须将2D数组中的所有X都更改为0,并且我必须计算最小步骤,其中单个步骤包括更改所需的整行或整列。例如,在类似- [[X, X, X], [X, 0, 0], [X, 0, 0]] 此处所需的最小步骤数为2 我想到了一种蛮力方法,在这种方法中,我在行和列之间分别检查一次,然后将它们与检查进行比较,检查的步骤数最少,但这会给我一个3的答案,这不是期望的输出 解决这个问题的最佳方法是什么 任何关于我应该如何处理这个问题的帮助或线索都将不胜感激,谢谢 提示1 考虑每一行和每一列都有

我有一个问题,我必须将2D数组中的所有X都更改为0,并且我必须计算最小步骤,其中单个步骤包括更改所需的整行或整列。例如,在类似-

[[X, X, X], [X, 0, 0], [X, 0, 0]] 此处所需的最小步骤数为2

我想到了一种蛮力方法,在这种方法中,我在行和列之间分别检查一次,然后将它们与检查进行比较,检查的步骤数最少,但这会给我一个3的答案,这不是期望的输出

解决这个问题的最佳方法是什么

任何关于我应该如何处理这个问题的帮助或线索都将不胜感激,谢谢

提示1 考虑每一行和每一列都有一个顶点的图

如果矩阵中M[i,j]处有一个X,则在顶点r_i和c_j之间有一条边

提示2 您的问题可以表述为尝试选择一组顶点,即选择行和列,使每个边(即每个X)至少接触集合中的一个顶点

这就是所谓的

提示3 一般来说,顶点覆盖是NP完全的,但在这种情况下,图是二部的

提示4 您可以使用最大流算法求解二部最小顶点覆盖,以计算行和列之间的最大匹配。有关更多详细信息,请参阅

解决方案 在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')

为什么是标签?我认为这可能是一个线性代数问题,因为它涉及矩阵;如果我做错了什么,我很抱歉。对不起,我是新手。没问题,没什么大不了的。如果你是这么想的,那么你可能想在你的问题主体中进一步解释为什么会是这样。至少对我来说,它不是那么明显,所以它可能会帮助回答你问题的人。我会继续编辑它。可能的副本我需要大量阅读才能理解所有这些,但感谢您的宝贵意见!