ここでも、最大の問題は二部グラフにおけるマッチングの難しさは、あなたが、これは2部グラフマッチング問題とどのようにマップ上に構築するかどうかを確認することができます。
この質問は、二部グラフの最大マッチング問題を確認することは困難です。
あなたはまた、任意の二つを入れ替えることができ、あなたが任意の2行を入れ替えることができ、それについて考えてみよう。
それらが同じ行になっている場合、任意の2つの黒いボックスの場合、どんなに交換、それらは同じ行(列共感)でないであろう。
そして、我々は唯一の私は気にしない無しその他(列共感)があり、黒の特定の列の1行が、仕事を取得する必要があります
ことは、事の二部グラフのマッチングではありません。
したがって、直接または物を完了するために、ネットワークフローアルゴリズムハンガリーで実行されています。
#include <iostreamの> する#include <STDLIB.H> する#include <stdio.hに> する#include < 文字列・H> に#define N 210 使用して 名前空間STDを、 INT T、N、G [N] [N]、NXT [N]、VIS [N]。 ブールマッチ(INT U){ ため(int型 i = 1 ; iは= N <; iは++ ) 場合(G [U] [I] &&!VIS [I]){ VIS [I] = 1 。 もし(NXT [I] ||!{一致(NXT [I])) NXT [I] = U。 返す 真; } } を返す 偽。 } int型のmain(){ scanf関数(" %のD "、&T)。 一方、(T-- ){ memsetの(G、0、はsizeof (G))。 memset(NXT、0、はsizeof (NXT))。 int型 TOT = 0 ; scanf関数(" %のD "、&N) 以下のために(int型 I = 1 iが++; iが<= N)のため(INT J = 1 ; J <= N; J ++)のscanf(" %dの"、&G [I] [J])。 以下のために(int型 i = 1 ; iが<= N; iは++ ){ memsetの(VIS、0、はsizeof (VIS))。 TOT + = マッチ(I)。 } もし(TOTの== n)でのprintf(" はいの\ n " ); 他のprintf(" ノー\ nを" ); } 戻り 0 。 }