最小スパニングツリーカウントテンプレートHDU 4408

質問はモジュロpの数を見つけるために、図M、最小全域木に縁なし、所定のn個の点のために意図されています。

それぞれが2つの異なるコネクタブロックユニコム最小側を取って、最小スパニングツリーkruscalを算出します。すなわち、Dを処理する1条C 1辺の長さ、及び、処理D 2条C 2辺の長さ。どんなに同じ辺の長さ?選挙、最大Unicom社のケースが固定されています。CそれぞれI C計算再び木をまたがる数を算出し、次いで、これらのブロックユニコムポイントを凝縮し、によって生成されるいくつかのユニコム側長ブロックI +。1辺の長さ。

スパニングツリーは、行列木定理を数え、1は //他の人のブログをコピーします。何も重い側は質問が重い側が生成されますされ、この点を縮小した後、マトリックス・ツリーにも適用され、ではありません

順序内の任意の部分行列のn-1の行列のキルヒホッフの行列の絶対値スパニングツリーのない量のこと。

隣接行列 - キルヒホッフは、マトリックスは、度の行列で定義されます。

1、G度行列D [G]:N * N行列、D IIのVに等しいIの程度が、残りはゼロです。
N * N行列、V:2、Gの隣接行列A [G] I、V J直接Aに接続されたエッジ間のIJさもなければIJ =、および0の間のエッジの数。

互いに素なセットFA [i]は、ノードが属し、現在のブロックの前にリンクの長さであり、KA [i]はエッジコネクタユニコムがブロックの現在の長さです。

1の#include <cstdioを>
 2の#include <CStringの>
 3の#include <アルゴリズム>
 4の#include <ベクトル>
 5  使って 名前空間STDを、
6のtypedef 長い LL。
7  のconst  int型 N = 101 8  のconst  int型 M = 1001 9  のLL N、M、P、ANS。
10ベクター< INT > GRA [N]。
11  構造体端{
 12      int型のU、V、W。
13  }、E [M]。
14  INTCMP(辺A、辺B){
 15      リターン AW < BW。
16  }
 17  LLマット[N] [N]、G [N]、[N]。
18  LL FA [N]、KA [N]、VIS [N]。
19  {(C [] [N]、LL N LL)LLのDET
 20      LL I、J、K、T、RET = 1 21      のために(i = 0 ; iがn <; I ++ 22      のための(j = 0 ; J <N; J ++)C [i]は[J] =%P。
23      のために(i = 0 ; iがn <; iは++ ){
 24          のための(j = iは+ 1、J <N; J ++ 25              一方、(C [J] [I]){
 26                 T = Cの[I] [I] / C [J] [I];
27                  のために(; K <N、K = iは++ kは28個の                      C [i]は[K] =(C [i]が[K] -c [J] [K] * T)%のP。
29                  スワップ(C [I]、C [J])。
30                  RET = - RET。
31              }
 32          であれば(C [i]は[I] == 0 33              リターン 0L 34          RET = RET * C [i]は[I]%のP。
35      }
 36      リターン(RET +のP)%のP。
37  }
 38は llの発見{(LL F [] LL)
 39      リターン [A] == F?:検索(F [A]、F);
 40  }
 41は、 ボイド matrix_tree(){ // 現在のリンク長エッジコネクタの各ブロックのためにスパニングツリーの数をカウント
42である     ためint型 I = 0 ; I <N-; ++ I)IF(VIS [I]){ // iはノードに接続された現在の辺の長さ
43は、          GRA [検索(I、KA)]一back(I);. // iノードはユニコムブロック押さ属する
44は          VIS [ I] = 0 ; // 側VIS空アレイ
45      }
 46である     ためint型 I = 0、I <N - 、I ++は47      IF(GRA [I] .size()> 1){ //ユニコムブロック1にまたがる点の数は
48          のmemset(MAT、0はsizeofの MAT); // クリアマトリクス
49          INT LEN = GRA [I] .size();
 50          INT J = 0 ; J < lenを; J ++ 51である         ためINT K = J + 1、K <LEN; K ++){ // 複数のエッジを有するマトリックスユニコムブロック(構築物)
52は             、INT、V = U = GRA [I] [J] GRA [Iは] [K];
 53である             IF (G [U] [V]){
 54である                  MAT [K] [J] =(MAT [J] [K] - = G [U] [V]);
 55                  MAT [K] [K] + = G [U ] [V]、マット[J] [J] + =G [U] [V]。
56              }
 57          }
 58          のANS =のANS * DET(マット、GRA [I] .size() - 1)%のP。
59          のためのint型 J = 0 ; J <LEN; J ++)FA [GRA [I] [J] = I。// 缩点
60      }
 61      のためにint型 i = 0 ; iがn <; iは++ 62      {
 63          GRA [I] .clear();
64          KA [I] = FA [I] = (FAをi)を見つけます。
65      }
 66  }
 67  INT メイン(){
 68      、一方(scanf関数(" %LLD%LLD%LLD "、&​​N、&M、およびP)、N){
 69          のためのint型 I = 0 ; iが<M; iが++ ){
 70              のint U、V、W。
71              のscanf(" %D%D%D "、&​​U&V、およびW)
72              U - ; v-- 73              E [I] = (エッジ){U、V、W}。
74          }
 75          ソート(E、E + M、CMP)。
76          のmemset(G、0はsizeofのG)。
77の          ANS = 1 78          のために(LL I = 0 KA [I] = FA [I] =; I <N-I ++)はI;
 79          (LL I = 0 ; I <= M、Iは++){ // エッジの上昇を加え
80              IF(!&& I E [I] .W = E [I- 1 ] || Iは.W mを==)// 処理長さeは[I-1]すべてのエッジ.W 
81                  )(matrix_treeを; // 計算スパニング
82は              LL U =(E [I] .U、FA)、V =検索(E [I] .V、FA)を探す; // でも点の二点凝縮後
83を             IF(U = V! )// そうでない場合は
84              {
 85                  VIS [V] = VIS [U] = 1 ;
 86                 KAは、[(U、KA)検索] =(V、KA)検索; // チャイナユニコムにブロック内の2つの成分。
87                  G [U]は[V] ++、Gは、[V] [U] ++; // 隣接行列
88              }
 89          }
 90          INTフラグに= 1 ;
 91である         ためINT I = 1 ; I <N-; I ++)IF(!FA [I] FA = [I- 1 ])フラグ=で0 ;
 92          のprintf(" %のLLDの\のN- "、フラグにANS%のP:?0); //は、そのpが1である場合があります、そしてm = 0のときもしそうでないとANS%のP意志出力1 
93      }
 94 }

 

おすすめ

転載: www.cnblogs.com/pangbi/p/11703113.html
おすすめ