POJ2239-選択Courses-(ハンガリーのアルゴリズム)

質問の意味:ドアごとの開始時間tをそれぞれ有するn個のコース、競合なしクラスまで選択。

溶液:クラス和にQの円周p値、セクションの複数の行を示す12 * 7週間のレッスン、最大一致と二部グラフ。

書式#include <stdio.hに> 
する#include <iostreamの> 
の#include <アルゴリズム> 
書式#include <CStringの> 
書式#include <math.h>の
書式#include < 文字列 > 
の#include <マップ> 
書式#include <キュー> 
の#include <スタック> 
#含ま < 設定 >
 の#defineは長い長いっ
 の#define 0x3f3f3f3f INF
 使用して 名前空間はstdを、

INTのN、M。
ベクター < INT > [ 305 ]。
BOOL VIS [ 7 * 12 +15 ];
 int型の PARの[ 7。 * 12で + 15 ]; 

BOOL DFS(INT X)
{ 
    int型 LEN = A [X] .size();
     のためのint型 I = 0 ; IはLEN <Iは++ 
    { 
        int型次へ= A [X] [I];
         IF(!VIS [次])
        { 
            VIS [次]が = trueにIF(PAR [次] || DFS()PAR [次]!)/// 次の次の非選択またはから選択コースを選択することができる他の期間が存在する
            { 
                PAR [次]X =; /// 次に今回ドアがXにより占有されている
                リターン trueに; 
            } 
        } 
    } 
    戻り falseに; 
} 



int型のmain()
{ 
    一方(scanfの(" %のD "!&N-)= EOF)を
    { 
        memsetの(PAR 、0はsizeof(PAR)); /// 消去
        するためのINT I = 1 ; I <= N; I ++は
            A [I] .clear(); 

        のためのINT I = 1 ; I <= N - 、Iを++  
        {
            scanf関数(" %のD "、&M);
             一方(M-- 
            { 
                int型P、Q、SUM; 
                scanf関数(" %Dの%のD "、P&&Q); 
                SUMは = P * 12で + Q; // / 7 * 12週レッスン部少ない行
                ; A [I] .push_back(SUM)
            } 
        } 
        int型 ANS = 0 ;
         のためのINT I = 1 ; I <= N; I ++は
        { 
            memsetの(VIS、falseにしますsizeof (VIS));
            もし(DFS(i))を
                ANS ++ ; 
        } 
        のprintf(" %d個の\ n " 、ANS)。
    } 

    戻り 0 
}
POJ2239

 

おすすめ

転載: www.cnblogs.com/shoulinniao/p/11332843.html