質問の意味:ドアごとの開始時間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 。 }