Главная » Файлы » Файлы

Алгоритмы для олимпиады по информатике
06.02.2012, 12:33

 Сборник чаще всего встречающихся алгоритмов для решения олимпиадных задач по информатике и программированию (Алгоритмы на графах; Длинная арифметика). Реализация представлена на Pascal,  т.е. то что чаще всего встречается на олимпиаде. Практически каждый элемент алгоритма оснащен полными комментариями.  Никакой лишней информации, исключительно точные и оптимизированные алгоритмы для полного понимания и восприятия. Например:

Алгоритм построения Эйлерова цикла (или пути) в графе

{нерекурсивный вариант алгоритма}

1. Сделать stack1 и stack2 пустыми;

    u1 - произвольная вершина графа (любая (обычно первая), если все вершины чётной степени, и вершина с нечетной степенью, если таковых две – для построения эйлерова пути);

2. занести u1 в stack1;

3. пока stack1 не пуст

  цикл

    занести в u вершину stack1;

        если u соединена с какой-нибудь вершиной, то в v занести номер первой вершины,  с   которой соединена u;

    в stack1 занести v;

    удалить ребро (u,v)из графа;

  иначе

      взять элемент с вершины stack1 и поместить в stack2;

кц

 

var sm:array[1..100,1..100]of byte; yk1,yk2,n,m,u,v,u1,I,j,k:byte;

    stepen,stack,res:array[1..100]of byte; fi,fo:text;

begin

 assign(fi,’eyler.in’);reset(fi); assign(fo,’eyler.out’);rewrite(fo);

 readln(fi,n,m);

 for i:=1 to m do

  begin

   readln(fi,u,v); sm[u,v]:=1;inc(stepen[u]);  sm[v,u]:=1;inc(stepen[v]);

 end;

k:=0;for v:=1 to n do

 if stepen[v] mod 2<>0 then inc(k);

 if k>2 then

 writeln(fo,’no’)

else

begin

 u1:=1;for v:=1 to n do if stepen[v] mod 2<>0 then u1:=v;

 yk1:=1;stack[yk1]:=u1;yk2:=0;

 while yk1<>0 do

begin

  u:=stack[yk1];

 if stepen[u]<>0 then

  begin

   v:=0;

    repeat

     inc(v);

    until sm[u,v]=1;

    inc(yk1);  stack[yk1]:=v;

    sm[u,v]:=0;sm[v,u]:=0; {удаляем ребро u,v из графа}

    dec(stepen[u]);dec(stepen[v]); {уменьшаем степень вершин u и v};

 end

else

begin

 u:=stack[yk1]; dec(yk1); inc(yk2); res[yk2]:=u;

end;

end;

for i:=1 to yk2 do write(fo,res[i]);

end;

close(f);

end. 

Категория: Файлы | Добавил: pascal
Просмотров: 1293 | Загрузок: 2 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Виджеты на сайт