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 列の行列として表される 2 部グラフを指定すると、
graph[i][j]
はtrue
pigeoni
から hole へのエッジがある場合にj
、穴を見つけることができる鳩の最大数 (鳩ごとに 1 つ) と最適な割り当てを計算します。
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
ます。このグラフ アルゴリズムは正しく機能しますか、それともエラーが発生しましたか?