P3033 [USACO11NOV】牛障害牛障害物競走

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 ; 
}

 

おすすめ

転載: www.cnblogs.com/QYJ060604/p/11520632.html