JZ高校OJ 1388サイクリング

説明

  自転車レースを開催Tsuiheng、N個(Nまで番号1)接合、Mと接続された他の双方向側Tsuihengあります。:ここではいくつかの定義され
  •パス:エッジのシリーズは、一の側の前端側の開始点を満たすために後者。
  •単純なパス:せいぜい一度各経路の交差点後;
  •リング:同じで開始および終了簡単なパス合流。
  少なくとも一つのパスは1個の環のみに表示され、また各側面の大部分を満たすことに加えて、交差点の各対の間に接続されていることを確認。
  あなたの仕事は、次の2つの条件に最長経路を見つけることである:
  出発点•任意の交差点でできますが、1号の交差点で終了しなければならない。
  •パスが同じ交差点を数回かもしれないが、それは、各エッジを通過します一回。
 

入力

  最初の行は、2つの整数N及びM(2 <= Nを<=含有 10000,1 <= M <= 2N-2)、 接合部の数やエッジの数を表します。
  次のM行は、二つの異なる整数A及びBを含む各行は(1 <= Aは、B <= N)は、 直接接続がエッジAとBの間に存在する表し、直線エッジとの間の2つの交点の唯一最大接続されています。

出力

  最長一致の出力経路の長さ。

 

サンプル入力

入力1:
4 3 
1 2 
1 3 
2 4 

入力2:
6 6 
1 2 
1 3 
2 4 
3 4 
3 5 
5 6 

入力3:
5 6 
1 2 
2 3 
3 4 
4 5 
5 3。
3 1

サンプル出力

出力1:
2 

出力2:
5 

出力3:6
プログラムstaza。
クラスを使用しています。
constの MAXN = 10000 ;
CONST PUT = 0 CONST DJIR = 1 VAR 
   N、M:倍長整数。
   I:倍長整数; 
   、B:倍長整数; 
   ADJ:配列 [ 1 ..MAXN] のTList。
   nPrstena:倍長整数; 
   broj:配列 [ 1 ..MAXN] 倍長整数。
   prsten:配列 [ 1 ..MAXN] のTList。
   スタック:配列 [1 ..MAXN] 倍長整数。
   stackTop:倍長整数; 
   prsteni:配列 [ 1 ..MAXN] のTList。
   mostovi:配列 [ 1 ..MAXN] のTList。
   traversalTime:倍長整数; 
   発見:配列 [ 1 ..MAXN] 倍長整数を、
   lowlink:配列 [ 1 ..MAXN] 倍長整数。
   メモ:配列 [ 1 ..MAXN、0 .. 1 ] 倍長。
手続きDFS(U、お父さん:倍長整数);
VAR 
   I、V:倍長整数; 
開始
   traversalTime: = traversalTime + 1を
   発見[U] = traversalTime。
   lowlink [U] = [U]発見。
   stackTop: = stackTop + 1 
   スタック[stackTop]: = U。
   ため = I 0  形容詞[U] .Count- 1が 実行 開始
      V: = 倍長(ADJ [U] .Items [I])を、
      もし、V =お父さんが、その後継続。
      もし発見[V] <>0  次に 始める
         場合ディスカバー[V] <lowlink [U]は次いで、 [U] lowlink:= [V]発見。
      エンド 他は 始まる
         DFS(V、U)を、
         場合 lowlinkは[V] <[U]を発見その後 始める
            場合 lowlink [V] <lowlink [U] 次いで[U] lowlink:= lowlink [V]。
         終了 他の 場合 lowlink [V] =発見[u]が、その後 始まる
            nPrstenaを: = nPrstena + 1 ; 
            prsten [nPrstena]: = TList.Create。
            しばらくスタック[stackTop] <> V実行 開始
               prsten [nPrstena] .Add(ポインタ(brojを[stackTop]スタック]))。
               stackTop: = stackTop- 1 エンド; 
            【nPrstena] .Add(ポインタ(broj [stackTop]スタック]))prsten。
            stackTop: = stackTop- 1 
            prsteni [U] .Add(ポインタ(broj [nPrstena]))。
         エンド 他は 開始
            mostovi [U] .Add(ポインタ(broj [スタック[stackTop]]))。
            stackTop: = stackTop- 1 エンド;
      エンド;
   エンド;
エンド;
関数MAX(A、B:倍長整数):倍長整数;
始める
   場合 > B その後、最大:= 他の最大を:= B;
エンド;
機能REC(X、stoRacunam:倍長整数):倍長整数。
VaRの
   利益:倍長整数; 
   P:倍長整数; 
   最高、smjer1、smjer2、ciklus:倍長整数; 
   I、J:倍長整数; 
開始
   場合メモ[X]が[stoRacunam]> = 0  次いで 開始
      REC: = メモ[X]を[stoRacunam]。
   終了  始める
      メモを[X] [stoRacunam]: = 0 ; 
      利益:= 0 ; (* どのように最大の利益あなたはXのに返す必要はありませんできた場合*)
      のための I = 0  橋[X] .Count- 1  にする 開始 (* X用の出てくるすべてのブリッジのため*)
         利益: = MAX(利益1 + REC(整数(ブリッジ[X] .Items [i])と、PATH))。
      エンド;
      ため = I 0  環[X] .Count- 1  ための 開始 (* よりXの全てのリングのため*)
         W: = 整数(環[X] .Items [I])。
         最高: =)])を挿入します)。0 ; 
         smjer1: = 1 ; smjer2:= 1 ; 
         ciklus: = prsten [P] .Count + 1 以下のために J:= 0  にする [P] .Count- prsten 1  ない 始める
            最良:(最高smjer1 + =最大)、REC(倍長整数(prsten [P] .Items [J])をPUTします)。
            smjer1: = smjer1 + 1 + REC(倍長整数(prsten [P] .Items [J])、DJIR)。
            ベスト: = MAX(最高smjer2 + REC(倍長整数(prsten [P] .Items [prsten [P] .Count-J- 1 1
            smjer2: = smjer2 ++ REC(倍長整数(prsten [P] .Items [prsten [P] .Count-J- 1 ])、DJIR)。
            ciklus: = ciklus + REC(倍長整数(prsten [P] .Items [J])、DJIR)。
         エンド; 
         メモ[X] [stoRacunam]: =メモ[X] [stoRacunam] + ciklus。
         利益: = MAX(利益、最高- ciklus)。
      エンド;
      もし stoRacunam = PUT 次にメモ[X] [stoRacunam]:=メモ[X] [stoRacunam] + 利益。
      REC: = メモ[X] [stoRacunam]。
   エンド;
エンド;
開始 I:=
   readln(N、M); 
   以下のための1   N  始める
      [I] ADJを: = TList.Create。
      mostovi [I]: = Tlist.Create。
      prsteni [I]: = Tlist.Create。
      broj [I]: = I。
   エンド;
    I:= 1   mが実行 開始
      readlnを(a、b)は、
      ADJ [A] .Add(ポインタ(broj [B]))。
      ADJ [B] .Add(ポインタ(broj [A])); 
   エンド; 
   traversalTime: = 0 ;
    I:= 1 のn 行います発見[I]:= 0 ; 
   stackTop: = 0 ; 
   nPrstena: = 0 ; 
   DFS(10 );
   以下のために私は:= 1  まで、nはない 開始
      メモを[I、0 ]:= - 1 
      メモ[I、1 ] = - 1 エンド; 
   writeln(REC(10 ))。
終わり

おすすめ

転載: www.cnblogs.com/anbujingying/p/11316554.html