P3033 [USACO11NOV】牛障害牛障害物競走
すべてのルーチンルーチンroutine!二部グラフのマッチング問題は、すべてのルーチンです!
ここで一般的な二部グラフ・マッチングの分析:線分と交差します
最大独立集合を求める線分のxまたはy軸に所定のNルート平行、
最小カットの総数= - - =合計最大独立集合最大流量
何をすることができますマッチング
覚えておいてください!先祖に関係なく、IJを参照してください!X1> X2、Y1> Y2参照の祖先を宣告ありません!
コード:
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #defineは、レジスタ再 の#define ILインラインのconst int型 N = 505 。 const int型 M = 500005 ; 構造体のライン{ int型X1、Y1、X2、Y2; } K [N]、K1 [N]、K2 [N]。int型 CNT1 = 0 ; int型 CNT2 = 0 ; 構造体ノード{ int型X、Y。 int型のval; }。int型のn; INT S [N]、[N]。 int型、L = 1 、R、ANS。 [ノードN * N + 100 ]。 INT [N] [N] C。 int型SX [N]、SYの[のN]、私たち[N]; IL BOOL CMP(ノードX、ノードY){ 戻り x.val < y.val。 } のIL ブールワーク(INT U){ // COUT << U << ENDL。 用(REのint型、V = 1 ; V <= CNT2; V ++ ){ もし、(C [U] [V] &&!私達[V]){ 米国[V] = 1 。 もし(SY [V] == - 1つの || 作業(SY [V])){ SX [U]= V; SY [V] = U。 リターン 1 ; } } } 戻り 0 。 } のIL INTのチェック(){ int型の和= 0 。 memset(C、0、はsizeof (c)参照)。 memset(SX、 - 1、はsizeof (SX))。 memset(SY、 - 1、はsizeof (SY))。 ため(再int型 I = 1 ; I <= CNT1; iは++ ){ 用(RE INT J = 1 ; J <= CNT2あり、j ++ ){ 場合(K1 [I] .x1> = K2 [J] .x1 && K1 [I] .x1 <= K2 [J] .x2 && K2 [J] .y1 > = K1 [I] .y1 && K2 [J] .y1 <= K1 [I] .y2){ C [I] [J] = 1 。 } } } のために(int型 I = 1 ; I <= CNT1; iは++ ){ memsetの(米国、0、はsizeof (米国))。 合計 + = 仕事(I); } 戻り値の和。 } int型のmain(){ scanf関数(" %dの"、&N) 用(RE INT i = 1 ; iが<= N; iが++ ){ scanf関数(" %D%D%D%D "、&K [i]は.x1、&K [i]は.y1、&K [i]は.x2、 &K [i]は.y2)。 もし(K [i]が.x1> K [i]は.x2)スワップ(K [i]が.x1、K [i]は.x2)。 もし(K [i]が.y1> K [i]は.y2)スワップ(K [i]が.y1、K [i]は.y2)。 もし(K [i]が.x1 == K [i]が.x2)K1 [++ CNT1] = K [i]は、 他 K2 [++ CNT2] = K [i]は、 } のprintf(" %d個の\ n "、N- チェック())。 リターン 0 ; }