Ограничения по времени:
1000 мс Пределы памяти: 65536 KB Подробные Пределы
Программа стаз; использует классы; Const MAXN = 10000 ; Const PUT = 0 ; Const Джир = 1 ; вар п, м: LONGINT; я: LONGINT; а, б: LONGINT; прил: массив [ 1 ..MAXN] из TList; nPrstena: LONGINT; Broj: массив [ 1 ..MAXN] из LongInt; prsten: массив [ 1 ..MAXN] из TList; стек: массив [1 ..MAXN] из LongInt; stackTop: LONGINT; prsteni: массив [ 1 ..MAXN] из TList; mostovi: массив [ 1 ..MAXN] из TList; traversalTime: LONGINT; открыть: массив [ 1 ..MAXN] из LongInt; lowlink: массив [ 1 ..MAXN] из LongInt; памятка: массив [ 1 ..MAXN, 0 .. 1 ] из LongInt; Процедура ДФС (и, папа: LONGINT); вар I, V: LONGINT; начинают traversalTime: = traversalTime + 1 ; открыть [и]: = traversalTime; lowlink [и]: = открыть [и]; stackTop: = stackTop + 1 ; стек [stackTop]: = и; для I: = 0 до прил [и] .Count- 1 действительно начинают V: = Longint (прил [и] .Items [I]); если v = папа затем продолжить; если Discover [v] <>0 , то начать , если Discover [v] <lowlink [и] , то lowlink [и]: = открыть [v]; конец еще начинать глубину (V, U); если lowlink [v] <открыть [и] затем начать , если lowlink [v] <lowlink [и] , то lowlink [и]: = lowlink [v]; конец еще , если lowlink [v] = открыть [и] затем начать nPrstena: = nPrstena + 1 ; prsten [nPrstena]: = TList.Create; в то время как стек [stackTop] <> vдействительно начинают prsten [nPrstena] .Add (указатель (Broj [стек [stackTop]])); stackTop: = stackTop- 1 ; конец ; prsten [nPrstena] .Add (Указатель (Broj [стек [stackTop]])); stackTop: = stackTop- 1 ; prsteni [и] .Add (Указатель (Broj [nPrstena])); конец еще начинают mostovi [и] .Add (Указатель (Broj [стек [stackTop]])); stackTop: = stackTop- 1 ; конец ; конец ; конец ; конец ; Функция макс (а, б: LONGINT): LONGINT; начать , если а> Ь , то макс: = а еще более: = Ь; конец ; Функция Rec (Х, stoRacunam: LONGINT): LONGINT; вар прибыль: LONGINT; Р: LONGINT; лучше всего, smjer1, smjer2, ciklus: LONGINT; I, J: LONGINT; начинают , если памятка [X] [stoRacunam]> = 0 , то начинают Rec: = заметки [X] [stoRacunam]; конец еще начинать памятку [X] [stoRacunam]: = 0 ; прибыль:= 0 ; (* Как максимальная выгода может , если вы не должны возвращаться в X *) для г = 0 для мостов [X] .Count- 1 , чтобы начать (* для всех мостов , которые выходят из X *) прибыль: = макс (прибыль 1 + Rec (целые (мосты [X] .Items [I]), PATH)); конец ; для I: = 0 для колец [X] .Count- 1 , чтобы начать (* для всех колец более X *) W: = = целое число (кольца [X] .Items [I]); лучше всего: ]), PUT));0 ; smjer1: = 1 ; smjer2: = 1 ; ciklus: = prsten [Р] .Count + 1 ; для J: = 0 до prsten [Р] .Count- 1 действительно начинают лучше: = тах (лучшее, smjer1 + Rec (LONGINT (prsten [Р] .Items [J]), PUT)); smjer1: = smjer1 + 1 + Rec (LONGINT (prsten [Р] .Items [J]), Джир); лучше всего: = макс (лучше всего, smjer2 + Rec (LONGINT (prsten [Р] .Items [prsten [Р] .Count-J- 1 1 smjer2: = smjer2 ++ Rec (LONGINT (prsten [Р] .Items [prsten [Р] .Count-j- 1 ]), Джиром); ciklus: = ciklus + Rec (LONGINT (prsten [Р] .Items [J]), Джир); конец ; памятка [X] [stoRacunam]: = памятка [X] [stoRacunam] + ciklus; прибыль: = макс (прибыль, лучше всего - ciklus); конец ; если stoRacunam = PUT затем памятка [X] [stoRacunam]: = памятка [X] [stoRacunam] + прибыль; REC: = памятка [X] [stoRacunam]; конец ; конец ; начинают ReadLn (п, т); для I: = 1 до п делать начать ADJ [I]: = TList.Create; mostovi [I]: = Tlist.Create; prsteni [I]: = Tlist.Create; Broj [I]: = I; конец ; для I: = 1 до т делать начинают ReadLn (а, б); прил [а] .Add (Указатель (Broj [б])); прил [Ь] .Add (Указатель (Broj [а])); конец ; traversalTime: = 0 ; для I: = 1 до п делать открыть [I]: = 0 ; stackTop: = 0 ; nPrstena: = 0 ; ДФС ( 1 , 0 ); для I: = 1 до п делать начинаются заметки [я, 0 ]: = - 1 ; памятка [я, 1 ]: = - 1 ; конец ; WriteLn (Rec ( 1 , 0 )); конец .