P3043 [USACO12JAN]牛連合(互いに素セット+数学)

 

(M <N <= 1E5、複数のエッジが存在します)

 

 トピックは、問題を表現.....

ビュー(必ずしもユニコム)が与えられ、それぞれの側は、それ自体がプログラム番号を尋ねることができるポイントの残りの2つの対の接続点のいずれかを選択することができます。

スタートは、私は非常に低い書き込みに話題と考えることができます....本当に怖かった.....

2つの結論に導入された場合でも、それはいいのよ

解決:

各ブロックのサイズの統計で、その後、一緒に組み合わせの数を掛け:最初は思いました。しかし、トラブルのビット:

リングケースは:リンクブロックとリングのために、次にn個の点、nはエッジが存在するであろう、それはドットユニコムの単一のブロックが存在することを意味します。別々に考慮リングブロック(以下、総称してリングブロックと呼ばれます)

 

 

片側に記載の自分の選択を決定するために、第1の側ならば、それは選択を取るだろう、左または右の二つの点から選択された第一の側面を決定するために、この3員環(偽)で参照してください、とこれは、次のとおりです。

2:エッジが決定された場合、プログラムの数は、全体のリングから決定することができます。

裸のリングリングはそれをブロックしていない場合は?

これを見て:

 

スープラは、環の2つを識別し、言うことですチェーン、年末によって占有されます。

リングブロック限り、答えの寄与は2です!

(グレート見つけます。)

非環式の場合を考えてみましょう:

n個の点、N-1エッジ(無向グラフ、ツリーがループされていない)、プログラムのn種類の合計の総。それを証明エモーショナル(どのように合理的に知りません):

最後の点が選択されていない、この点は、状況のn種類の合計選択されていない、これはプログラムのn種類です。

最後に、乗算の原理に従って、一緒にすべてのプログラムの数を掛けANSです。

結論要約すると、タイトルは次のようになります。マップ与え、リングにブロックを見つけるために、中国聯通、中国聯通のブロックサイズを決定し、統計的な答え

ユニコムブロック?私は互いに素セットを持っています!

リングを探しますか?私はtarjanを持っています!

(私には二つの大きな人の兄弟の次Zの姓、このタイトルもtarjan、2手に代わりに焦点を当て?あなたは??? zwjdd長さになりたいです)

ここで(環無向グラフ決意処理であるメモ、環を見ていない、唯一の存在が決定されます

そこに、このリングエッジ点=ユニコムを横断の回数場合や原理的に互いに素なセットの使用は、ブロックです。

カザフスタンは、次のようになります....私はあまりにも弱かったです

コード(注版):

#include <ビット/ STDC ++ H.>
 使用して 名前空間STD;
 のconst  int型 MAXN = 1E6の+ 5。 CONST  INT MOD = 1E9 + 7。 ロング ロング F [MAXN]、NUM [MAXN]、N-、M、ANS = 1 、C [MAXN ];
 ロング ロング検索(ロング ロング X)は{ 返す F [X] X X ==:?F [X] =を智アイス//兄を余儀なくされたラインと、検索(F [X])} 
//変数を宣言:NUM []:ユニコムのブロックサイズは、F []は説明されていない、C []ユニコムブロックの数は、エッジ
INT メイン() { scanfの(" %のLLDの%のLLD "、およびN-、&M)を、 ためINT I =。1 ; I <= N; I ++の F [I] = I、NUM [I] = 1 ; //初期化 するためのINT I = 1 ; I <= M、Iが++ { 長い ロングX、Y; scanfの(" %のLLDの%のLLD 、およびX&Y); ロング ロング FAは= 検索(X); ロング ロング FB = 探す(Y)、 IF(FA =!FB)//マージ { F [FA] = FB; NUM [ FB] + = NUM [FA];合成ユニコムの//ブロックサイズ NUM [FA]= 0 ; //ブロックサイズはクリアユニコム C [FB] + = C [FA] + 1 ; //複数の内部ブロックエッジユニコム } { C [FB] ++ ; //または非ツリーの複数エッジ } } のためのINT I = 1 ; I <= N; I ++は { IF(Fは、[I]は==私はCを&& [I] < NUM [I])//もしエッジの数ないクレジット複数 ANS = ANS * NUM [ I]%MOD; //統計答え IF(Fは、[I]は==私は&& C [I]が> = NUMは、[I])//そうでない場合は、直接ループ2 * ANS =(ANS << 1。 )%MOD。 // Xiaoxuming覚え } (のprintf "LLD%" 、ANS); // LONGLONGパンと 返す 0 ; }

(終わり)

おすすめ

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