HDUキャッチ(奇数リング部グラフ解析+互いに素なセット決意ユニコム)

 

問題の説明
泥棒は離れて実行しています!
私たちは、彼が十字架と縁が路上放置のために立ってどのノードに無向グラフとして探し出し都市を考えることができます。交配は、0からN-1までのラベル付けされています。
トリッキーな泥棒は、彼がクロスS.からの脱出彼は、隣接クロスに移動し、それぞれの瞬間を開始します。より正確には、彼は瞬間tにおけるクロスUであると仮定します。彼があれば時刻t + 1でクロスvで表示されることがあり、クロスuとクロスvと通りがある場合にのみ。彼は二つの連続した瞬間に同じクロスに滞在しないかもしれないことに注意してください。
警官は泥棒は、市内のどのクロスに表示することが可能ですこれで、いくつかの瞬間があるかどうかを知りたいです。
入力
入力は複数のテストケースが含まれています
入力の最初の行でテストケースの数である整数Tがあります。次いで、Tテストケースの説明を行います。
任意のテストケースのために、最初の行は三つの整数(100 000≤)Nを含んでいる、M(≤500 000)、及びS. Nは交差の数です。Mは、通りの数であり、Sは、泥棒が彼のエスケープを開始し、クロスの指標です。
次のMラインのために、各ライン(U≤0、V <N)を2つの整数uとvが存在するであろう。これは、クロスuとクロスVと無向通りがありますを意味します。
出力
泥棒は任意のクロスに表示するためにそれが可能だ瞬間があります場合には、各テストケースの場合、出力1行が教えてくれます。出力フォーマットの出力例を見てください。
サンプル入力
2
3 3 0
0 1
0 2
1 2
2 1 0
0 1
サンプル出力
ケース1:YES
ケース2:NO

点から開始点からマップに、出発点xを与えるために、エッジをmのn個の点のNoneに、各ユニットにのみ可能である近傍点に行き、モーメントが尋ねるようになりましたがない、次のことができます。質問の意味図の任意のノードで。
アイデア:グラフは二部グラフの場合はまず、それは図と通信しない場合、これが常にではない、第二に、完璧なタイミングがありません(図は二つの半分、半分が奇数の到着時間、半分もの到着時間に分けること)
したがって、唯一の図の通信、及び非二部グラフにおけるとき有するために存在する時間。互いに素な集合通信によって決意し、次に図に二部グラフか否かを判断します。
 
溶液パターニング驚異は、二部グラフモデル化された染色特性を鳴らします
 
コード:
//
の#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
#define maxnn 2000110
 int型N、M、S。
INTラス[maxnn]、NEX [maxnn]、TOT、EN [maxnn]、COL [maxnn]、FLA = 0 INT [maxnn] F。
int型T;
INT   GF(INT V)
{ 
    リターン?[V] == V V F:[V] = F GF([V] F)。
} 
ボイド追加(INT A、INT B)
{ 
    EN [ ++ TOT] = Bと、
    NEX [TOT] = ラス[A]。
    ラス[A] = TOTを、
}
ボイド erfen(int型 V、INTのNUM)
{ 
    COL [V] = NUM。
    もし(FLA == 1のリターン;
    以下のためにint型 I =ラス[V]; I; I = NEX [I])
    { 
        int型、Y = EN [I];
        もし(COL [Y] == COL [V])
        { 
            FLA = 1 返します
        } 
        もし(!COL [Y])
        { 
            erfen(Y、 - NUM)。
        } 
     }
     返します
} 
int型のmain()
{ 
    int型X、Y、Z。
    CIN >> T;
    int型 TOT = 0 ;
    一方、(T-- 
    { 
        TOT ++ 
        scanf関数(" %D%D%D "、&​​N、&M&S)。
        memset(LAS、0はsizeof (LAS))。
        memset(COL、0はsizeof (COL))。
        INT秒= N。
        以下のためにint型私= 0 ; iがN <; I ++
            F [I] = I。
        以下のためにint型私= 1 ; I <= M; iが++ 
        { 
            scanf関数(" %D%D "、およびX&Y)。
            (x、y)を加えます。
            追加(Y、X)。
            もし(!GF(X)= GF(Y))
            { 
                F [GF(X)] = GF(Y)。 - 
            } 
        } 
        もし(!秒= 1 
        { 
            のprintf(" ケース%D:"、TOT)。
            printf(" NO \ nを" );
            続け; 
        } 
        FLA = 0 
        erfen(s、1 )。
        printf(" ケース%D:" 、TOT)。
        もし(FLA == 1 
            printfの(" YES \ N " );
        
            のprintf(" NO \ nを" ); 
    } 
}

 

おすすめ

転載: www.cnblogs.com/OIEREDSION/p/11272807.html