https://www.luogu.org/problem/P2319
そこの質問のモデレータmは、n個の異なるプレイヤーが持っている「良いアイデアを。」司会の規定は、それぞれの質問には、それぞれ「良いアイデアは、」一度だけ使用することができる2「いいアイデア」のいずれかを選択することができます。我々はまた、優れたアイデアを使用することができます質問の後、我々はうまく次の質問に、正しく答えることができるようになることを前提としています。今、私はショーに来たが、私は本当にばかな、しないだろうが、「良いアイデア」を使用して、各質問を助けるために質問が通ってきます。私は使用することができ、それぞれの質問にどのような二つの「いいアイデア」事前に知っていた場合は、自分で質問のほとんどの数を選択する方法を教えてくださいできますか?
良いアイデアの右に左のポイントとして問題を置き、一方向のポイント
[]問題に(答)への優れたアイデアの権利を指すのです
この問題のために良いアイデアとANS []
そのため、各見つける()xは、左のすべての問題なので、質問の数と優れたアイデアの数ではなく混乱していることを保証するために、
この光の中で見られる、二部グラフの最大マッチングは非常に柔軟です
#include <iostreamの> する#include <cstdioを> する#include <アルゴリズム> の#include <CStringの> する#include <キュー> の#define RI登録INT の#define U INT の#define NN 5005 の#define MM 100005 名前空間{高速 Uをインラインで() { UX(0 )。 チャー S = GETCHAR()。 一方、(S < ' 0 ' || S> ' 9 ' ){ S = GETCHAR()。 } 一方、(S> = ' 0 ' && S <= ' 9 ' ){ X =(X << 1)+(X << 3)+ S- ' 0 ' 。 S = GETCHAR()。 } 戻りX; } } 使用して速い:: に。 名前空間のすべての{ [NN]にU字CNT、N、M、ANS [NN]、VT [NN]、H [NN]。 構造体ノード{ uは、隣。 } [MM << 1 ]。 インラインのボイド追加(のconstU&X、CONST U&Y){ [ .next ++ CNT] = H [X]、[CNT] .TO = Y、H [X] = CNT。 } Uは(見つけるCONST U&X){ ため(RI I(H [X])を、I;私は= [I] .next){ U字_y([I] .TO)を、 もし(VT [_y])を続けます。 VT [_y] = 1 。 もし([_y] ||に!(見つけるために[_y])){ [_y]へ = xで、ANS [X] = _y。 リターン 1 ; } } 戻り 0 。 } インラインボイド(解決){ N = で()、M = 中(); 用(RI I(1); I <= M; ++ I){ (U字_a で、_ B())(中())。 (I、_a追加 + 1)、(I、_b +追加1 )。 } のための(RI I(1); I <= M; ++ I){ 場合(!{ANS [i])と のmemset(VT、0、はsizeof (VT))。 もし(!見つける(i))をブレーク。 他 ++ ANS [ 0 ]; } } のprintf(" %d個の\ n "、ANS [ 0 ])。 用(RI I(1 ; iが[=のANSを<)0 ;] ++ {I) のprintf(" %d個の\ n "、ANS [I] - 1 )。 } } } int型のmain(){ // freopenは( "X.TXT"、 "R"、STDIN)。 すべて::)(解きます。 }