タイトルの意味
それぞれが強連結グラフのポイントを持って見ているビューを提供します
ポイントの値と少なくとも見えるように求め、そのいくつかの選挙法の最小値を求めました
トピック分析
Tarjanアルゴリズムの数を用いて、各スタックが見つけるとき強いグラフと最低点の値とこの点を見つけるプロセスをスタックに
最後に、各強連結グラフの最小値一緒に、すべての最終的な答えを得るの数を乗じました
トピックコード
書式#include <iostreamの> 書式#include <stdio.hに> する#include < 文字列の.h> 使用して 名前空間はstdを、 typedefの長い 長いLL。 const int型 MAXN = 1E5 + 7 。 const int型 MOD = 1E9 + 7 。 const int型 INF = 0x3f3f3f3f 。 構造体の縁{ INT 次へ。 } E [MAXN * 3 ]。 int型のヘッド[MAXN]、ミンク[MAXN]、NWAY [MAXN]、ST [MAXN]、instack [MAXN]、低[MAXN]、DFN [MAXN]は、[MAXN]費用。 int型、M、A、B、トップ、CNT、SCC、TOT、N。 ボイド追加(INT U、INT V){ E [TOT] .TO = V。 E [TOT] .next = 頭部[U]。 ヘッド[U]は ++ TOTを= 。 } ボイドのinit(){ memsetの(頭、 - 1、はsizeof (ヘッド))。 } ボイド Tarjan(INT X){ ST [ ++トップ] =のX。 instack [X] = 1 。 低[X] =のDFN [X] = ++ CNT。 以下のために(int型 I =ヘッド[X];!I = - 1 ; I =E [I] .next){ int型、Y = E [I] .TO。 もし(!DFN [Y]){ Tarjan(Y)。 低[X] = 分(低[x]は、低[Y])。 } そう であれば(instack [Y])低[X] = 分(DFN [Y]、[x]は低いです)。 } もし([X] == DFN 低い[X]){ int型 P = - 1 。 SCC ++ ; ミンク[SCC] = INF。 実行{ P = ST [トップ]。 instack [P] = 0 。 もし(コスト[P] < ミンク[SCC]){ ミンク[SCC] = コスト[P]。 NWAY [SCC] = 1 。 } そう であれば(コスト[P] == ミンク[SCC]) NWAY [SCC] ++ ; トップ - ; } ながら(ST [トップ+ 1 ] =!X)。 } } ボイドDFS(){ ため(int型 i = 1 ; iが<= N iが++ ) 場合(!Tarjan(I)DFN [I])。 } int型{main()の scanf関数(" %のD "、&N) 以下のために(int型 i = 1 ; iが<= N; iは++ ) scanf関数を(" %のD "、およびコスト[I])。 scanf関数(" %のD "、&M)。 その中に(); 用(int型 I = 1 ; I <= M Iは++ ){ scanf関数(" %D%D "、&、&B)。 追加(A、B)。 } DFS()。 LL和 = 0、のSumN = 1 。 以下のための(int型 i = 1 ; iが= SCCを<; Iは++ ){ 合計 + = ミンク[I]。 SumN =(のSumN *のNWAY [I])%MOD。 } のprintf(" %のLLD%のLLDを\ n " 、合計のSumN)。 リターン 0 ; }