JZ High School OJ 1388 Велоспорт

Описание

  Tsuiheng провести велосипед гонки, Tsuiheng есть N - переход (пронумерованных от 1 до N), M и другую двустороннюю сторона которого соединена. Вот несколько определений:
  • путь: серия края, последний встретить отправную точку для стороны переднего конца с одной стороны;
  • простой путь: не более одного раза после каждого пересечения путей;
  • кольцо: начало и конец в том же простой путь перехода.
  Убедитесь , что по крайней мере один путь , подключенный между каждой парой пересечений, в дополнение к также удовлетворить большую часть каждой стороны появляется только в одном кольце.
  Ваша задача состоит в том, чтобы найти самый длинный путь к следующим двум условиям:
  • отправной точки может быть на любом перекрестке, но должна заканчиваться на пересечении № 1;
  • путь может быть через тот же перекресток в несколько раз, но он будет идти только через каждое ребро один раз.
 

вход

  Первая строка содержит два целых числа N и М (2 <= N <= 10000,1 <= М <= 2N-2), представляет число переходов и число ребер.
  Следующие строки M, каждая строка , содержащая два различных целых числа А и В (1 <= A, B <= N) представляет собой прямую связь существует между ребрами А и В, только максимум двух пересечений между прямым краем подключен.

Выход

  Выходная длина пути самого длинного матча.

 

Пример ввода

Вход 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
Программа стаз; 
использует классы; 
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 ));
конец .

рекомендация

отwww.cnblogs.com/anbujingying/p/11316554.html