時間制限:
1000のミリ秒のメモリ制限: 65536キロバイトの詳細な制限
プログラム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(1、0 ); 以下のために私は:= 1 まで、nはない 開始 メモを[I、0 ]:= - 1 。 メモ[I、1 ] = - 1 。 エンド; writeln(REC(1、0 ))。 終わり。