Главная » Файлы » Файлы |
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. | |
Просмотров: 1293 | Загрузок: 2 | |
Всего комментариев: 0 | |