P2860()

件名の説明:

F(1≤F≤5000)ベッシーと彼女の仲間で牧草地から別のに移動するには、時には彼らの厄介な恐ろしいツリーの一部を渡す必要があります。牛が道に行くことを余儀なくの疲れているので、彼らはそれぞれが互いに離れパスが牧草地の間にある少なくとも二つを持っているように、新しい道を構築したいので、彼らはより多くの選択肢を持っています。

これは、牧草地のすべてのペアの間に少なくとも1つのパスを持っています。説明は、新しい道路の最小数、道路の複数の接続端から端までの経路を計算し、全てのR(F-1≤R≤10000)双方向パス、二つの異なる牧草地を結ぶ各経路について説明します。互いから分離された二つのパスは、一方向に重ならない2つのパスを指します。しかし、2つの別個の経路上の同じ牧草地の一部が存在してもよいです。牧草地の間に同じのために、あなたは二つの異なる道路を持っていることが、あなたはまた、別の異なるパスとして、それらの間の道路を構築することができます。

簡単に言えば、辺の数が(必ずしもではないリング)リング上のすべてのポイントを作ることができます高めることです

ソリューション:

 

ユニコムダブルエッジ:エッジ、まだユニコム図を削除。以来:

質問面が意味することをではないですか?

テンプレートの疑問?

だから、アイデアは明確である:ハード実行後tarjanを終了します。

どのようにハードそれを実行するには?点の間のように、すべてのダブルエッジは、中国聯通1速いの統計限り、中国聯通のブロックで、その後ユニコムブロック間の側縁に巻き上がり、見つけるために、あなたは答えを得ます。

アップ縮小し、その後、プラス側が最適な達成するために、それらに接続さ二十から二を与えるようにしてくださいどのくらいのポイント1度のある見つけるために、すべての既存のリング

なぜル?

まず、プラス側よりも大きい1ポイントの程度は、リングが最大のリングに見つからない、ポイント数、二十から二を接続し、それらのポイント1のようにのみ程度を解決した問題を解決するための側面を主導している可能性が、数の統計が答えです。

だから、全体の主題は非常に明確です:

ヒント:

それは無向グラフであるため、1、2点のそれぞれが環を形成するために、すべての操作は、神を持っている:^ 1

2 ^ 1 ^ 1 = 2 = 3,3; 4 ^ 1 = 5,5 ^ 1 = 4 ....

正と負の両方のエッジがエッジになるように、検索、一緒に保持され、その後、XOR演算は、インデックスの次のエッジを取得する必要があり、それらはマーカー気力マークされているので、有向グラフを実行することができます。

ピット:

1は、そのうちの一つは、排他的または0になりますので、もし、排他的論理和演算のために、すべてが1に初期化されたCNT、あまり走った.....

ANSが奇数の場合2、/ 2プロセスは、精度の損失、全て+1/2であってもよい......

3、これ以上の.....

コード:

 

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
const  int型 MAXN = 100005 ;
構造体の
{ 
    INT 次へ。
} E [MAXN << 1 ]。
INTのN、M、ANS。
int型のヘッド[MAXN << 1 ]、CNT = 1 INT X [MAXN]、Y [MAXN]。
インラインボイド addedge(INT  からINT に)
{ 
    E [ ++ CNT] .next =ヘッド【から]。
    E [CNT] .TO = であり; 
    頭[] = CNT。
} 
INT DFN [MAXN]、低[MAXN]、TOT、VIS [MAXN]、トップ。
int型ST [MAXN]、色[MAXN]、COL。
int型RU [MAXN]。
ボイド tarjan(int型U)を
{ 
    DFN [U] =低[U] = ++ TOT。
    ST [ ++トップ] = U;
    以下のためにint型 ; I I = I =ヘッド[U] E [I] .next)
    { 
        int型、V = E [I] .TO。
        もし(!VIS [I])
        { 
            VIS [I] = VIS [I ^ 1 ] = 1 もし(DFN [V] ==0 
            { 
                tarjan(V)。
                低[U] = 分(低[U]、[V]低いです)。
            } 
            
            { 
                低い[U] = 分(低[U]、[V] DFN)。
            } 
        } 
    } 
    もし([U] == DFN 低い[U])
    { 
        色[U] = ++ COL。
        一方、(ST [トップ] =!U)
        色[ST [トップ] = COL、top-- 
        トップ - ; 
    }         
} 
int型のmain()
{ 
    scanf関数(" %d個%のD "、&​​N、&M)。// N =読み取る(); M =読み取ります()。
    以下のためにint型 I = 1 ; I <= M; iは++ 
    { 
        scanf関数(" %d個の%のD "、およびX [i]は、&​​Y [I])。// X [i]は=()を読み取る; Y [i]が読み取り=(); 
        addedge(X [i]は、Y [I])。
        addedge(Y [i]は、X [I])。
    } 
    
    ためにint型 i = 1 ; iが<= N; iが++ 
    { 
        場合(!DFN [i])と
        tarjan(I)。
    } 
    
    のためにint型 iは= 1 ; I <= M iは++ 場合(!色[X [I] = カラー[Y [I])
    RU [色[X [I]]] ++、RU [色[Y [i]は]] ++ ; 
    
    以下のためにint型 I = 1 ; I <= COL iは++ 場合(RU [I] == 1 
    ANS ++ 
    
    printf(" %d個の\ n "、ANS + 1 >> 1 )。
    リターン 0 ; 
}

 

(Zrxdl %%%)

(終わり)

おすすめ

転載: www.cnblogs.com/ajmddzp/p/11289096.html