【发布时间】: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)返回trueiff 鸽子i可以分配一个洞
- 将所有组件中的
cnt包含快乐鸽子的数量。
在我的例子中,cnt 的值输出为0。这个图形算法是否正常工作还是我犯了一些错误?
【问题讨论】:
标签: c++ graph-theory bipartite