URL:http://codeforces.com/problemset/problem/1198/C
質問の意味:
図所与$ 3 * n個の$ $ Mは$点とエッジ、エッジの端点は、片側のみに属することができ、以下のように定義されたエッジの組を含む、次のように定義されたポイントを設定:いいえ任意の2点をエッジ接続。点$ N- $出力$「IndSet」の集合であるようなサイズがある場合、そのようなサイズは$、エッジ$ N- $出力$「マッチング」$の組と、入力シーケンス番号の側の順序である場合とポイントの数、そうでない場合は、出力$「不可能」$。($ \和のn \当量の1E5、\和メートル\の当量の5E5の$)。
ソリューション:
エンドポイントの片側が占有されているかどうかを直接決定、記録終了点は、次に訪問し、されているが、エッジのない記録は$ Nエッジが存在する場合、それは、$「マッチ」$ない場合でなければならない、$記事を記録しているか否かを判断しますいくつかの$「IndSet」$が存在しなければなりません。
(TLEは、私はC ++のストリームを使用していない、あなたは$のmemsetの$を使用しているもののために、少なくとも$ 5 $を作った、$ベクトル$、必要不可欠なダイレクトアナログ配列、それ以外のすべてのTLEを使用しないでください)。
ACコード:
#include <ビット/ STDC ++ H> 名前空間STDを使用して、 BOOL VIS [300005]。 int型のANS [500005]。 INTのmain() { int型のT。 scanf関数( "%のD"、&T)。 (T--)一方 { int型N、M、U、V。 scanf関数( "%d個の%のD"、&N、&M)。 memsetの(VIS、0、はsizeof(VIS [0])* 3 *(N + 1))。 int型NUM = 0; (I = 1をint型; I <= M; ++ i)のための { scanf関数( "%D%dの"、&U、およびV)。 IF(VIS [U] && VIS [V]!) { VIS [U] = VIS [V] = 1。 ANS [NUM ++] = I; } } もし(NUM < { int型POS = 0; 以下のために(int型I = 1; I <= 3 * n個&& n個のpos <; ++ I) の場合(!VIS [i])と ?のprintf( "%d個の%のC"、I、(++ POS == N '\ nは':'「)); } 他 { のprintf( "マッチする\ n"); (; iが<= N ++ iは1 = INT)のための (? "%d個の%のC"、ANS [I-1]、(I == N '\ n':」「))のprintf。 } } 0を返します。 }