图表中的最大匹配

时间:2011-11-18 18:41:00

标签: c++ graph matrix

我有一个有趣的问题:
我的程序必须找到1的最大数量。 但那还不是全部! 如果该程序已“看到”1,则应清除1所在的整个列和行。

我遇到的问题:
我找不到1的最大数量,我不知道该怎么做。

对于你我做了一个小例子,我希望你能清楚。该计划必须像这样工作:

有一个矩阵:

1 0 0 0
1 0 1 1
1 1 1 1
1 0 0 1

该程序找到了1(位置[0][0]我在黑色中突出显示了它,并清除了行和列:

Example 2

在此之后我们找到下一个1,清除行和列,依此类推:

Example 3

最后,程序应打印黑色单元格的数量。

在我的例子中,它是4

如何在C++代码中执行此操作?请帮我!谢谢。

4 个答案:

答案 0 :(得分:3)

我更喜欢这样做(参见下面的代码):使用两个“for”循环,在第二个内部使用条件“if”将第三个“for”循环添加到设置为0。

for(int i=0;i<m;i++)
    for(int j=0;j<n;j++)
    {
        if(cow[j][i]==1)
        {
            cnt++;
            for(int k=0;k<n;k++)
                cow[k][i]=cow[j][k]=0;
            break;
        }
    }

答案 1 :(得分:2)

目前尚不清楚如何在矩阵中搜索“下一个”1以及矩阵是否只能包含0和1.但如果有明确的“下一个”定义,那么您只需编码就像您一样已在上面描述过。可能的代码片段如下所示(未测试,甚至未编译):

 bool find_next_one(int&x, int&y, matrix const&M)
 {
   // next is in (col,row) order
   for(; x!=M.size(0); ++x)
     for(; y!=M.size(1); ++y)
       if(M(x,y)==1) return 1;
   return 0;
 }
 int count_one(matrix const&M_original)
 {
   matrix M(M_original); // make copy where we can set elements to 0
   int count=0;
   int x=0,y=0;
   while(find_next_one(x,y,M)) {
     ++count;
     for(int i=0; i!=M.size(1); ++i) M(x,i) = 0;
     for(int i=0; i!=M.size(0); ++i) M(i,y) = 0;
   }
   return count;
 }

答案 2 :(得分:1)

注意到这看起来像矩阵奇点类型检查 - 特别是如果1和0是唯一要使用的东西。

您可以检查矩阵的确定性。非零意味着它等于行数和列数(如果矩阵总是方形的。)如果是det(0),那么使用任何你想要将矩阵缩小到简化形式的技术来查看有多少0列你有 - 或者只是先减少并沿着对角线计数。

按照其附加值对列进行排序,将以对角线形式为您提供。这样可以很容易地检查0列。

答案 3 :(得分:1)

我不会为你编写所有代码,但会建议一些让你走上正轨的东西。您应该了解如何迭代二维数组(矩阵)以及如何迭代该矩阵中的单个行或列。

给定矩阵的(硬编码)定义,如下所示:

struct Matrix4x4
{
    int        m[4][4];
};

迭代你想写的所有元素:

   Matrix4x4 matrix;

   for (size_t row = 0; row < 4; ++row)
   {
       for (size_t col = 0; col < 4; ++col)
       {
           // do something with 'matrix.m[row][col]'
       }
   }

这将从左上角(0,0)到右下角(3,3)遍历矩阵。我假设这是你被告知使用的遍历顺序。

要处理您要编写如下内容的行:

   void FunctionThatOperatesOnARow(Matrix4x4& matrix, size_t row)
   {
       for (size_t col = 0; col < 4; ++col)
       {
           // do something with 'matrix.m[row][col]'
       }
   }

要处理要编写如下内容的列:

   void FunctionThatOperatesOnAColumn(Matrix4x4& matrix, size_t col)
   {
       for (size_t row = 0; row < 4; ++row)
       {
           // do something with 'matrix.m[row][col]'
       }
   }

你现在需要做的是修改迭代所有元素的代码的第一位并让它检查1.你需要调用相应的函数来清除当前的列和行(你可以根据关于后两个例子)。

对于最终结果,每次检测到1时都可以简单地递增一个本地计数器变量。