デイリー質問day11パンチ
分析
久しぶりの大きなTarjan、および練習問題のテンプレート。
アレイ全体Siの長いスイープを超える1 Tarjanのように見えています。
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <CStringの> 4の#include <アルゴリズム> 5 の#define MAXN 10000 + 10 6 の#define MAXM 50000 + 10 7 使って 名前空間STD。 8インラインint型リード() 9 { 10 INT X = 0 。 11 ブール F = 1 。 12 チャー C = GETCHAR()。 13 のために(!; isdigit(C); C = GETCHAR())場合(C == ' -')、F = 0 。 14 のために(; isdigit(C); C = GETCHAR())x =(x << 3)+(X << 1)+ C- ' 0 ' 。 15 であれば(F) 、リターンX。 16 リターン 0 - X。 17 } 18インラインボイド書き込み(INT X) 19 { 20 であれば(X < 0){のputchar(' - '); X = - X;} 21 場合(X> 9)書き込み(X / 10 )。 22 のputchar(Xの%10 + ' 0 ' )。 23 } 24 int型N、M、CNT、NUM、上部、COL、ANS。 25 のint [MAXN]頭[MAXM]、DFN [MAXN]、低[MAXN]、CO、ST [MAXN]、SI [MAXN]。 26 構造体ノード{ INT 次へ;}エッジ[MAXM]。 27インラインボイド追加(int型のx、int型のY) 28 { 29 エッジ[++ CNT] .TO = Y。 30 エッジ[CNT] .next = 頭部[X]。 31 頭[X] = CNT。 32 } 33インラインボイド Tarjan(INT U) 34 { 35の DFN [U] =低[U] = ++ NUM。 36 ST [++トップ] = U。 37 のために(int型 I =ヘッド[U]; I; I = エッジ[I] .next) 38 { 39 のint V = エッジ[I] .TO。 40 であれば(!DFN [V]) 41 { 42 Tarjan(V)。 43 低[U] = 分(低[U]、[V]低いです)。 44 } 45 、他の 場合(!コ[V]) 46 低[U] = 分(低[U]、DFN [V])。 47 } 48 であれば(低[U] == DFN [U]) 49 { 50 CO [U] = ++ COL。 51 ながら(ST [トップ] =!U) 52 { 53 SI [COL] ++ ; 54 コ[ST [トップ]] ++ ; 55 - トップ。 56 } 57 SI [COL] ++ ; 58 - トップ。 59 } 60 } 61 のint main()の 62 { 63 N =(読み取り); M = (読み取り) 64 のためには、(int型 I = 1 ; I <= M; iが++ ) 65 { 66 INTは X =読み取る()、Yは= read()は。 67 追加(X、Y) 68 } 69 のための(int型 i = 1 ; iが<= N; iが++ ) 70を 場合(!DFN [i])と 71 Tarjan(I)。 72 のためには、(int型 = Iを1 ; iが<= COL、iは++ ) 73 であれば(SI [I]> 1)年++ ; 74 書き込み(年); 75 リターン 0 ; 76 }
論文をギャングしてください(とにかく、私はそれが論文を何を意味するのか知りません)