両側に接続された各ポイントのために、つまり、人々はすべての座席の試合で最大のマッチングを求めて、2つの位置をやりたい、効果の対象に
ここで、我々は二次元を開くのが好き、座席2試合、01への復帰を表します。
ハンガリーテンプレートのタイトル。
書式#include <cstdioを> する#include <iostreamの> の#include <CStringの> 使用して 名前空間はstd; int型の一致[ 500000 ] [ 2 ]。 INTヘッド[ 500000 ]、N、ANS。 int型 VIS [ 500000 ]、TOT; 構造体ノード{ int型NXT、であり; } E [ 500000 ]。 BOOL DFS(INT X){ ため(int型 I =ヘッド[X]を、I; I = E [I] .nxt){ int型 J = E [I] .TO。 もし(VIS [J])継続; VIS [J] = 1 ; IF(!マッチ[j] [ 0 ] || DFS(一致[j] [ 0 ])){ // 最初のシートjが既に一致していない 一致[J] [ 0 ] = X; 返す trueに; } IF(一致[J] [!1。 ] || DFS(一致[J] [ 1。 ])){ // 上記の [マッチ[J] 。1 ] = X; 返す trueに; } } 戻り値 をfalseに ; // マッチしない } 、ボイドワーク(){ ため(int型 i = 1 ; iが= <(N << 1 ;)++ {I) のmemset(VIS、0、はsizeof (VIS))。 ANS + = DFS(I)。// 求最大匹配 } } インラインボイド追加(int型のx、int型の Y){ // 临接表 E [++ TOT] .nxt = 頭部[X]。 ヘッド[X] = TOT。 E [TOT] .TO = Y。 } int型のmain(){ scanf関数(" %のD "、&N) 用(INT I = 1 - ; << Iに<=(N 1 {; Iは++))// 2N点が int型X、Y; scanfの(" %のDの%のD "、およびX&Y)を、 追加の(I 、X);追加(I、Y); // 私はエッジ位置を望んでも } 作業(); のprintf(" %d個の\ N- " 、ANS); を返す 0 ; }