- •Билет 1
- •Билет 2
- •Способы представления графов
- •Билет 3
- •Билет 4
- •Билет 5
- •Билет 6
- •Билет 7
- •Основы визуального программирования
- •Билет 8
- •Обменная сортировка.
- •Конструкторы и деструкторы
- •Билет 9
- •Билет 10
- •Статическое и динамическое распределение памяти. Понятие указателя.
- •Процедуры и функции модуля graph.
- •Билет 11
- •Доступ к системным ресурсам в операционной системе pc-dos
- •Билет 12
- •Билет 13
- •Билет 14
- •Билет 15
- •Алгоритм генерирования перестановок с минимальным числом транспозиций
- •1. Введение в теорию графов. Способы представления графов: матрицы смежности и инцидентности, списки инцидентностей, списки ребер.
- •2. Функции библиотеки dos. Прерывания. Обработка прерываний.
- •Связные компоненты графа. Деревья. Бинарное дерево как связный граф без циклов
- •2.Сортировка вставками
- •2)Итерационные циклы
- •1.Эйлеровы пути в графе.
- •2.Ввод-вывод с помощью текстовых файлов.
- •Алгоритм Дейкстры (Dijkstra)
- •Вопрос 1.
- •Вопрос 2.
- •Создание и обработка одномерных динамических массивов.
- •Операторы цикла.
- •2.Сортировка распределением
- •1)Односвязные линейные списки
- •2) Записи. Организация, размещение. Записи с вариантами.
- •1.Алгоритмы с возвратом, их реализация с помощью рекурсий и с использованием стека. Гамильтоновы циклы.
1.Эйлеровы пути в графе.
Эйлеров граф — граф, содержащий эйлеров цикл.
Эйлеров путь (эйлерова цепь) в графе — это путь, проходящий по всем рёбрам графа и притом только по одному разу.
Эйлеровым называется цикл, проходящий по каждому ребру графа ровно один раз. Граф, имеющий эйлеров цикл, тоже будем называть эйлеровым.
Полуэйлеров граф — граф, содержащий эйлеров путь (цепь).
Теорема (критерий эйлеровости графа): граф является эйлеровым тогда и только тогда, когда степени всех его вершин – чётные числа.
Требование связности в теореме естественно – несвязный граф может быть эйлеровым только в том случае, если только одна связная компонента содержит рёбра.
В неориентированном графе : согласно теореме, доказанной Эйлером, эйлеров цикл существует тогда и только тогда, когда граф связный и в нём отсутствуют вершины нечётной степени. Эйлеров путь в графе существует тогда и только тогда, когда граф связный и содержит не более чем две вершины нечётной степени.
Ввиду леммы о рукопожатиях, число вершин с нечётной степенью должно быть четным. А значит Эйлеров путь существует только тогда, когда это число равно нулю или двум. Причём когда оно равно нулю, эйлеров путь вырождается в эйлеров цикл.
В ориентированном графе: граф содержит эйлеров цикл тогда и только тогда, когда он сильно-связан и для каждой вершины графа её полустепень захода равна её полустепени исхода, то есть в вершину входит столько же ребер, сколько из неё и выходит.
Поиск эйлерова пути в графе:
Можно всегда свести задачу поиска эйлерова пути к задаче поиска эйлерова цикла. Действительно, предположим, что эйлерова цикла не существует, а эйлеров путь существует. Тогда в графе будет ровно 2 вершины нечётной степени. Соединим эти вершины ребром, и получим граф, в котором все вершины чётной степени, и эйлеров цикл в нём существует. Найдём в этом графе эйлеров цикл), а затем удалим из ответа несуществующее ребро.
Каждая вершина этого графа имеет чётную степень, поэтому этот граф — эйлеров. Обход рёбер в алфавитном порядке даёт эйлеров цикл.
2.Ввод-вывод с помощью текстовых файлов.
При открытии текстового файла внешний файл интерпретируется особым образом: считается, что он представляет собой последовательность символов, сгруппированных в строки, где каждая строка заканчивается символом конца строки (end-of-line), который представляет собой символ перевода каретки, за которым возможно следует символ перевода строки.
Для текстовых файлов существует специальный вид операций чтения и записи (read и write), который позволяют вам считывать и записывать значения, тип которых отличается от символьного типа Char. Такие значения автоматически переводятся в символьное представление и обратно. Например, Read(f,i), где i - переменная целого типа, приведет к считыванию последовательности цифр, интерпретации этой последовательности, как десятичного числа, и сохранению его в i.
Как было отмечено ранее, имеются две стандартных переменных текстового типа - это Input и Оutput. Стандартная файловая переменная Input - это доступный только по чтению файл, связанный со стандартным файлом ввода операционной системы (обычно это клавиатура), а стандартная файловая переменная Оutput - это доступный только по записи файл, связанный со стандартным файлом вывода операционной системы (обычно это дисплей). Перед началом выполнения программы DOS файлы Input и Оutput автоматически открываются, как если бы были выполнены следующие операторы:
Assign(Input,'');
Reset(Input);
Assign(Output,'');
Rewrite(Output);
Так как Windows не поддерживает непосредственно ориентированный на текст ввод и вывод, файлы Input и Output по умолчанию в прикладной программе Windows не присваиваются, и любая попытка чтения из этих файлов или записи в них приведет к ошибке ввода-вывода. Однако, если прикладная программа использует модуль WinCrt, то Input и Output будут ссылаться на прокручиваемое текстовое окно. Модуль WinCrt содержит всю логику управления, необходимую для эмуляции текстового экрана в операционной среде Windows, поэтому в прикладной программе, использующей модуль WinCrt, не требуется никаких приемов программирования, специфических для Windows.
Для некоторых из стандартных процедур и функций, список которых приведен в данном разделе, не требуется явно указывать в качестве параметра файловую переменную. Если этот параметр опущен, то по умолчанию будут рассматриваться переменные Input или Output, в зависимости от того, будет ли процедура или функция ориентирована на ввод или на вывод. Например, Read(х) соответствует Read(Input,х) и Write(х) соответствует Write(Output,х).
Если при вызове одной из процедур или функций из этого раздела вы задаете файл, этот файл должен быть связан с внешним файлов с помощью процедуры Assign и открыт с помощью процедуры Reset, Rewritе или Append. Если для ориентированной на вывод процедуры или функции вы указываете файл, который был открыт с помощью процедуры Reset, то выведется сообщение об ошибке. Аналогично, будет ошибкой задавать для ориентированной на ввод процедуры или функции файл, открытый с помощью процедур Rewrite или Append.
procedure vvod(var E:matr;filename:stroka; var n:integer); // ВВОД
var
fin:text;
begin
assign(fin, filename);
reset(fin);(rewrite)
Read(fin,n);
writeln('Размерность матрицы: N = ',n);
(fin‘результат’)
writeln;
for i:=1 to n do
begin
for j:=1 to n do
begin
read(fin, E[i,j]);
write(E[i,j]:4);
end;
writeln;
end;
close(fin);
end;
Билет 22
Кратчайшие пути. Алгоритмы Дейкстры, Флойда.
Алгоритм Флойда (Floyd)
Алгоритм Флойда (также известный как алгоритм Флойда-Уоршэлла, Floyd-Warshall) предназначен для поиска кратчайших путей между всеми парами вершин взвешенного графа. Пусть граф задан матрицей смежности A[N][N] по следующему правилу: A[i][j] равно
0, если i равно j;
бесконечности (очень большому числу), если из i в j нет ребра;
весу ребра между вершинами i и j в остальных случаях.
Алгоритм Флойда делает N итераций, после i-й итерации матрица А будет содержать длины кратчайших путей между любыми двумя парами вершин при условии, что эти пути проходят через вершины от первой до i-й. На каждой итерации перебираются все пары вершин и путь между ними сокращается при помощи i-й вершины. Ниже приведен код основного фрагмента программы и иллюстрация:
В этом случае значение массива C[j][k] после окончания алгоритма будет указывать одну из вершин, через которую проходит путь от j к k, и восстановление пути будет возможно сделать простым циклом либо при помощи рекурсивной функции.
Алгоритм Флойда требует O(N3) времени для работы и O(N2) памяти для хранения матрицы C. Для корректной работы алгоритма необходимо, чтобы в графе отсутствовали циклы отрицательной длины (в этом случае понятие кратчайшего пути не определено).