图中的二分匹配

时间:2011-10-29 08:26:51

标签: c++ graph-theory

我有以下代码,它是BPM的实现(二分图匹配,来自图论)

#include <iostream>
#include <cstring>
using  namespace std;
#define M 128
#define N 128
bool graph[M][N];
bool seen[N];
int matchL[M],matchR[N];
int n=4;
int m=4;

bool bpm(int u){

    for(int v=0;v<n;v++) if(graph[u][u])
    {
                if (seen[v]) continue;
                seen[v]=true;
                if(matchR[v] <0 || bpm(matchR[v])){
                    matchL[u]=v;
                    matchR[v]=u;
                    return true;
                }
    }

    return false;

}

int main(){

    graph[0][1]=1;
    graph[0][3]=1;
    graph[1][3]=1;
    graph[0][2]=1;
     memset(matchL,-1,sizeof(matchL));
     memset(matchR,-1,sizeof(matchR));
     int cnt=0;
     // memset(seen,0,sizeof(seen));
     for(int i=0;i<m;i++){

        memset(seen,0,sizeof(seen));
          if(bpm(i)) cnt++;

     }
     cout<<cnt<<endl;
    return 0;
}

cnt的定义和此代码的目的如下。

  

给定一个表示为m×by矩阵的二分图,其中graph[i][j]true如果有鸽子ij的边缘,则计算可以找到一个洞(每只鸽子一只)的最大鸽子数量和最佳分配。

  • graph[m][n]matchL[n]matchR[m]seen[m]是全局数组。
  • main()在所有组件中初始化matchL[]matchR[]-1
  • main()对所有参赛鸽进行循环i并在每次迭代中

    • 在所有组件中清除seen[]0
    • 调用bpm(i)并递增maxflow计数器
    • bpm(i)返回true如果鸽子i可以分配一个洞
  • cnt包含快乐鸽的数量。

就我而言,cnt的值输出为0。这个图算法是否正常工作还是我犯了一些错误?

1 个答案:

答案 0 :(得分:2)

您的初始化有问题或bpm()中的这种情况有问题:

       if (graph[u][u])

对角线上没有graph的元素设置true,因此bpm()总是完全失败。还不清楚为什么你需要单独测试对角线。也许它应该是if (graph[u][v]),或者可能是别的。

(你的缩进有点不合需要;将if这样的条件放在与for循环控件相同的行上非常常规。顺便提一下,{{1}的初始化}和matchL仅适用于二进制补机。)