羅区P2341 [HAOI2006]人気の牛の説明

今日は学校が強連結成分の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 }
論文をギャングしてください(とにかく、私はそれが論文を何を意味するのか知りません)

 

おすすめ

転載: www.cnblogs.com/handsome-zyc/p/11237703.html