強連結グラフ、Tarjan - CodeForces - 427C

トピックリンク

タイトルの意味

それぞれが強連結グラフのポイントを持って見ているビューを提供します

ポイントの値と少なくとも見えるように求め、そのいくつかの選挙法の最小値を求めました

トピック分析

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 ; 
}

 

おすすめ

転載: www.cnblogs.com/helman/p/11285688.html