独立集合思考対codeforces1198Cマッチング

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を返します。
}

 

おすすめ

転載: www.cnblogs.com/Aya-Uchida/p/11299048.html