C++ 图中的最大匹配

C++ 图中的最大匹配,c++,graph,matrix,C++,Graph,Matrix,我有一个有趣的问题: 我的程序必须找到1的最大数量。 但这还不是全部!。 如果程序已“看到”1,则应清除1所在的整个列和行 我的问题是: 我找不到1的最大数量,我不知道怎么做 我给你举了一个小例子,希望你能明白。程序必须按如下方式运行: struct Matrix4x4 { int m[4][4]; }; Matrix4x4 matrix; for (size_t row = 0; row < 4; ++row) { for (si

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

我的问题是:
我找不到
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]'
       }
   }
   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 0 0 0
1 0 1 1
1 1 1 1
1 0 0 1
程序找到了
1
(位置
[0][0]
我用黑色突出显示了它),并清除了行和列:

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

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

在我的例子中,它是
4


如何在
C++
code中完成?请帮帮我!谢谢。

不清楚如何在矩阵中搜索“下一个”1,以及矩阵是否只能包含0和1。但如果对“下一步”有一个明确的定义,那么您只需按照上面描述的方式编写代码即可。可能的代码段如下所示(未测试,甚至未编译):


注意,这看起来像是一个矩阵奇点类型检查-特别是当1和0是唯一要使用的东西时

你可以检查矩阵的确定性。非零意味着它等于行数和列数(如果矩阵始终为正方形)。如果det(0),则使用任何技术将矩阵简化为简化形式,以查看有多少0’d列-或者只需先进行简化,然后沿对角线计数


按附加值对列进行Heck排序,将以对角线形式显示。这将使检查0列变得非常容易。

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

给出如下矩阵的(硬编码)定义:

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]'
       }
   }
   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]'
       }
   }
要对所有元素进行迭代,您需要编写如下内容:

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]'
       }
   }
   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]'
       }
   }
Matrix4x4矩阵;
用于(行大小=0;行数<4;++行)
{
用于(大小\u t列=0;列<4;++列)
{
//使用“matrix.m[row][col]”执行某些操作
}
}
这将在矩阵上从左上角(0,0)到右下角(3,3)进行迭代。我假设这是您被告知要使用的遍历顺序

要处理一行,请编写如下内容:

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]'
       }
   }
   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]'
       }
   }
void函数操作单列(矩阵x4x4和矩阵,大小为行)
{
用于(大小\u t列=0;列<4;++列)
{
//使用“matrix.m[row][col]”执行某些操作
}
}
要处理要编写如下内容的列,请执行以下操作:

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]'
       }
   }
   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]'
       }
   }
void函数,用于操作单列(矩阵x4x4和矩阵,大小\u t列)
{
用于(行大小=0;行数<4;++行)
{
//使用“matrix.m[row][col]”执行某些操作
}
}
您现在需要做的是修改迭代所有元素的第一位代码,并让它检查1。然后需要调用适当的函数来清除当前列和行(可以基于后两个示例)


对于最终结果,您可以在每次检测到1时简单地增加一个局部计数器变量。

我更喜欢这样做(请参见下面的代码):使用两个“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;
        }
    }

用于(int i=0;我请发布一些您已经尝试过的代码。这个社区是为了帮助代码编写人员,而不是编写所有代码。我不明白。您是否需要清除矩阵,使其数量达到最大值,或者您只需迭代,在找到内容时删除内容,最后计算您找到了多少内容?上一篇我认为s 1有点难。使用“清除”约束,打印的数字不可能超过矩阵的较小维度,并且只有当某行或某列都为零时,它才会小于该数字。这有帮助吗?