P4208 [JSOI2008]最小スパニングツリー数
タイトル説明
今、単純な重み付き無向図を示します。あなたはこの数字計算された最小スパニングツリーに満足していないが、どのように多くの異なる最小スパニングツリーこの数字が知りたいのです。(最小スパニングツリーの少なくとも2つの異なる側面が存在する場合、最小スパニングツリーが異なっているの両方)。異なる最小スパニングツリーはたくさんすることができ、あなたはそれだけでアナログ出力31011の数をプログラムする必要がありますので。
入力形式
最初の行は、2つの数値を含み、nおよびmは、1 <= N <= 100; 1 <= M <= 1000;無向グラフのノードとエッジの数を表します。1〜nの整数で各ノード。
次のm行、二つの整数を含む各列:A、B、Cを、1 <= C <=10億ノードa、b値cと右側を表します。
データは自信裏側と重い側には表示されません。注:同じエッジ重み値が10以下です。
出力フォーマット
どのように多くのスパニングツリーを異なる出力最小。あなただけ出力することで、金型31011の番号が必要です。
サンプル入力と出力
入力#1
4 6 1 2 1 1 3 1 1 4 1 2 3 2 2 4 1 3 4 1
出力#1
8
説明/ヒント
说明1 <= N <= 100。1 <= M <= 1000; 1 <= CI <= 1E9
ゾル:同じ重さの最小スパニングツリーは非常に形而上機能を有する固定側の数であり、同じ効果の右側が同じである場合、辺の数が同じであれば注目ポイントがプログラムを見つけられるように、プログラムを検索バーストができます互いに素なセットパスは場合数に圧縮することができない、そうでない場合に戻るハング
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedef int型LL。 インラインLLリード() { LL S = 0。BOOL F = 0。CHAR CH = ' ' ; しばらく(!isdigit(CH)){F | =(CH == ' - '); CH = GETCHAR();} ながら(isdigit(CH)){S =(S << 3)+(S << 1)+(CH ^ 48)。CH = GETCHAR();} リターン(F)(? - S):( S)。 } の#define R(x)は、x =リード() インラインボイドライト(LLのX) { 場合(X < 0){のputchar(' - ')。X = - X;} もし(X < 10){のputchar(X + ' 0 ')。返す;} 書き込み(X / 10)。putchar((X%10)+ ' 0 ' )。 } の#define W(x)は書き込み(X)のputchar( ' ') の#define WL(X)の書き込み(X)のputchar('の\ n') のconst int型 N = 105、M = 1005、モッド= 31011 。 INTのN、M、FA [N]、LIAN [N]。 構造体のエッジ { int型U、V、W。 } E [M]。 インラインブール CMPW(エッジP、エッジqは){ 戻り PW < QW;} インラインINT GF(INT X){ リターン(FA [X] == x)は、x:FA [X] = GF(FA [X]) ;} インラインINT GL(INT X){ リターン(LIAN [X] == x)は?X:GL(LIAN [X]);} インラインINT DFS(INT今、INT端、int型CNT) { 場合(今==エンド+ 1) { 。もし(CNT == 0)リターン 1 。 リターン 0 ; } INT ANS = DFS(今+ 1 、終わり、CNT)。 int型のFX =のGL(E [今] .U)、FY =のGL(E [今] .V)。 もし(!FX = FY) { LIAN [FX] = FY。 ANS + = DFS(今+ 1、終わり、CNT- 1 )。 LIAN [FX] = FX。 } 戻りANS。 } int型のmain() { int型 I、J、TOT = 0 R(N)R(M); 用(i = 1 ; I <= M; iは++ ) { R(E [I] .U)。R(E [I] .V)。R(E [I] .W)。 }ソート(E + 1、E + M + 1 、CMPW)。 用(i = 1 ; iが<= N; iは++)FA [I] = I。 int型 ANS = 1 ; 用(i = 1 ; I <= M;) { ため(J = 1 ; J <= N; J ++)LIAN [J] = J。 int型の OOは=私は、今= TOTを。 一方、(I <= M && E [I] .W == E [OO] .W) { E [I] .U= GF(E [I] .U)。E [I] .V = GF(E [I] .V)。I ++ ; } ため(J = OO; J <I、J ++ ) { int型の FX = GF(E [J] .U)、FY =のGF(E [J] .V)。 もし(!FX = FY) { TOT ++; FA [FX] = FY。 } } ANS = 1LL * ANS * DFS(OO、I- 1、TOT-NOW)%のMod。 } であれば(TOT == N- 1 )、WL(ANS)。 他のプット(" 0 " ); リターン 0 ; }