我有以下代码,它是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
如果有鸽子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
如果鸽子i
可以分配一个洞 cnt
包含快乐鸽的数量。
就我而言,cnt
的值输出为0
。这个图算法是否正常工作还是我犯了一些错误?
答案 0 :(得分:2)
您的初始化有问题或bpm()
中的这种情况有问题:
if (graph[u][u])
对角线上没有graph
的元素设置true
,因此bpm()
总是完全失败。还不清楚为什么你需要单独测试对角线。也许它应该是if (graph[u][v])
,或者可能是别的。
(你的缩进有点不合需要;将if
这样的条件放在与for
循环控件相同的行上非常常规。顺便提一下,{{1}的初始化}和matchL
仅适用于二进制补机。)