[解説]座席配置

トピックリンク

両側に接続された各ポイントのために、つまり、人々はすべての座席の試合で最大のマッチングを求めて、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 ; 
}

 

おすすめ

転載: www.cnblogs.com/h-lka/p/11256487.html