今日は学校が強連結成分のTarjanのアルゴリズムであり、この道は、(Iチューン1.5時間が)タイトルの質問にボードに似ていました。主なアイデアは、(私も側の反対であったため、実際度)の各点の程度を見つけ、Tarjanポイントの後収縮を使用することです。もし
が一つであり、貫入の一点のみがゼロより大きく、数が強く、いくつかの点でコンポーネントを接続答えです。コードの特定の実装を参照してください。
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <CStringの> 4の#include <アルゴリズム> 5 の#define MAXN 10010 6 の#define MAXM 50010 7 使って 名前空間STD。 8 INT DFN [MAXN]、低[MAXN]、ST [MAXN]、イン[MAXN]、ヘッド[MAXM]。 9 int型デ[MAXN]、SI [MAXN]。 10 int型N、M、CNT、上部、INL、NUM。 11 構造体ノード 12 { 13 int型のU、V、NEX。 14 }エッジ[MAXM]。 15インラインint型READ() 16 { 17 INT X = 0 。 18 ブール F = 1 。 19 チャー C = GETCHAR()。 20 のために(!; isdigit(C); C = GETCHAR())場合(C == ' - ')、F = 0 。 21 のために(; isdigit(C); C = GETCHAR())x =(x << 3)+(X << 1)+ C- ' 0 ' 。 22 であれば(F) 、リターンX。 23 リターン 0 - X。 24 } 25インラインボイド書き込み(INT X) 26 { 27 であれば(X < 0){のputchar(' - '); X = - X;} 28 場合(X> 9)書き込み(X / 10 )。 29 のputchar(Xの%10 + ' 0 ' )。 30 } 31インラインボイド追加(int型のx、int型のY) 32 { 33 CNT ++ 。 34 エッジ[CNT] .Uの=のX。 35 エッジ[CNT] .V = Y。 36 エッジ[CNT] .nex = 頭部[X]。 37 頭[X] = CNT。 38 } 39インラインボイド Tarjan(INT から)// 用Tarjan缩点 40 { 41の [DFN から [=低] から = ++] NUM。 42 ST [++トップ] = から。 43 のために(int型 I =ヘッド【から ];!I = - 1 ; I = エッジ[I] .nex) 44 { 45 INT=のエッジ[I] .V。 46 であれば(!DFN [に対して]) 47 { 48 Tarjan(へ)。 49 [ローから =分(低[ より低い、] [します])。 50 } 51 そう であれば(!イン【に】) 52 ロー[ から ] =分(低[ から]、DFN [します])。 53 } 54 であれば(ロー【から == DFN] [ から]) 55 { 56 イン【から = ++] INL。 57で のSi [INL] ++; // 点の数に各強連結成分のレコード 58 ながら(!ST [トップ] = から) 59 { 60 ++のSi [INL]; // 同上 61は イン[ST [トップ] = INL; 62である - トップ、 63である } 64 - トップ; 65 } 66 } 67 のint main()の 68 { 69 のmemset(ヘッド、 - 1、はsizeof (ヘッド)); 70 N- =読みます()。 = M 読みます()。 71である ため(INT I = 1 ; I <= M; I ++ ) 72 { 73は int型、Y X; 74 X =読む(); Y = 読む(); 75 追加(Y、X); // でもエッジを有するトランスそのようにできないから秩序度 76 } 77 のために(INT I = 1 ; I <= N; I ++は) 78 IF(!DFN [I]) 79 Tarjan(I); // 点集光 80 のため(INT I = 1 ; I <= N; I ++ ) 81 のための(int型 J =ヘッド[I] ;! J = - 1。 ; J = エッジ[J] .nex) 82 IF(イン[I] =イン[エッジ[J] .V])デ・[イン[エッジ[J]! .V] ++; // 更新侵入 83 INT ANS = 0、U = 0 ; 84 用(INT I = 1 ; I <= INL; I ++は) 85 { 86 IF(!デ[I])// ゼロより大きくなる場合 87 { 88の ANS = Siの[I]; // 割り当て 89 U ++; // レコードが条件を満たしているいくつかの点を有する 90 } 91 } 92 IF(U == 1)//がゼロ点よりも一つだけ大きいがあるか否かを判断する 93 の書き込み(ANS)は、 94 他の 95 の書き込み(0); // 他のない溶液出力 96 リターン 0 ; 97 }
論文をギャングしてください(とにかく、私はそれが論文を何を意味するのか知りません)