この質問は、ハンガリーのアルゴリズムを練習することですが、ネットワークフローオフ、それを切断するために使用することができますが、
私たちは、スーパーソースを構築し、スーパー、左部のスーパーソース接続ポイント、超交換接続ポイントの右部分をシンクすることができます。
最大流量は、それを描く上で実行されます。
PS:私のソースは、2001年のスーパーセットであり、超交換は2002年です。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 構造体littlestar { int型に、 int型のNXT。 int型のw; }星[ 5000010 ]。 int型のヘッド[ 5000010 ]、CNT; インラインボイド追加(INT U、INT V、INT W) { 星[ ++ CNT] .TO = V。 スター[CNT] .nxt = ヘッド[U]; 星[CNT] .W = W。 ヘッド[U] = CNT。 } int型、E、M、N。 INT DIS [ 3010 ]; キュー < 整数 > Q; インラインブールBFS() { memsetの(DIS、0、はsizeof (DIS))。 一方、(q.size()){ q.pop()。 } q.push(2001 )。 DIS [ 2001 ] = 1 。 一方、(q.size()){ int型、U = q.front()。 q.pop(); 以下のために(int型 ; I I = I =ヘッド[U]は{星[I] .nxt) のint Vを=スター[i]は.TO。 もし(スター[i]が.W &&!DIS [V]){ q.push(V); DIS [V] = DIS [U] + 1 。 もし(Vの== 2002 ){ 返す 1 。 } } } } 戻り 0 。 } int型 dinic(INT U、INT フロー) { 場合(U == 2002 ){ 戻り流; } int型の残り= 流; int型TMP; 用(登録をint ; iが残り&& iが= [U] I =ヘッド{星[I] .nxt) のint V = スター[I] .TO。 もし(星[I] .W && DIS [V] == DIS [U] + 1 ){ TMP = dinic(V、分(残り、星[I] .W))。 もし(!TMP)DIS [V] = 0を。 スター[i]は.W - = TMP; スター[I ^ 1 ] .W + = TMP; 残り - = TMP; } } を返す flow- 休息を。 } INT maxflow。 int型メイン() { scanf関数(" %D%D%D "、&N、&M、およびE)。 ため(登録をint i = 1 ; iは= <N; iは++ ){ (追加2001、I、1 )。 追加(I、2001、0 ); } ため(登録をint = I 1を iが++; iが<= M ){ 追加(N + I、2002、1 )。 (追加2002、N + I、0 ); } のための(レジスタINTi = 1 ; iが= Eを<; Iは++ ){ int型V、Uと、 scanf関数(" %d個の%d個"、&U&V); (U、N追加 + V、1 )。 追加(N + V、U、0 ); } int型の流量= 0 。 一方、(BFS()){ ながら(流量= dinic(2001、999999999))maxflow + = 流量; } COUT << maxflow。 }