【问题标题】:Bipartite matching in graph图中的二分匹配
【发布时间】:2011-10-29 08:26:50
【问题描述】:

我有以下代码,它是 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×n 矩阵的二分图,其中 graph[i][j]true 如果从鸽子 i 到洞 j 有一条边,计算可以找到的最大鸽子数一个洞(每只鸽子一个)和一个最佳分配。

  • graph[m][n]matchL[n]matchR[m]seen[m] 是全局数组。
  • main() 在所有组件中将matchL[]matchR[] 初始化为-1
  • main() 循环遍历所有鸽子i 并在每次迭代中

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

在我的例子中,cnt 的值输出为0。这个图形算法是否正常工作还是我犯了一些错误?

【问题讨论】:

    标签: c++ graph-theory bipartite


    【解决方案1】:

    要么你的初始化有问题,要么bpm()中的这个条件有问题:

           if (graph[u][u])
    

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

    (您的缩进有些不尽人意;将这样的if 条件与for 循环控制放在同一行是非常不合常规的。顺便提一下,matchLmatchR 的初始化仅适用于 2 的补码机器。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      相关资源
      最近更新 更多