質問はモジュロ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 }