Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
oaip.docx
Скачиваний:
7
Добавлен:
26.09.2019
Размер:
292.13 Кб
Скачать

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. Для корректной работы алгоритма необходимо, чтобы в графе отсутствовали циклы отрицательной длины (в этом случае понятие кратчайшего пути не определено).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]