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

2.2 Алгоритм Флойда-Уоршелла

Задан ориентированный взвешенный граф. Требуется построить для этого графа матрицу кратчайших путей между всеми парами вершин.

Алгоритм решения.

Пусть веса дуг заданы в виде матрицы D. Будем решать задачу методом динамического программирования. Обозначим за длину кратчайшего пути между вершинами i и j, который в качестве промежуточных содержит только вершины с номерами, не превосходящими k. Рассмотрим случай, когда k=0. Это означает, что промежуточных вершин в путях быть не может. Значит, путь будет существовать между теми вершинами, между которыми по условию есть дуга. Тогда матрицу построим на основе матрицы D следующим образом. Во-первых, расстояние между вершинами, между которыми нет дуги, положим равным бесконечности. Во-вторых, из вершины в неё саму всегда можно добраться за нулевое число шагов, поэтому если вес дуги (i,j)  положителен, то заменим его нулём. Пусть теперь k>0. Понятно, что искомый кратчайший путь может либо проходить через вершину с номером k, либо нет. Если он проходит через эту вершину, то его можно разбить на две части: путь от i до k и путь от k до j. Поскольку оба этих пути должны являться кратчайшими, имеем следующее рекуррентное соотношение:

Асимптотическая сложность алгоритма – O(), где N – число вершин графа.

Так же, как и в алгоритме Форда-Беллмана, объём используемой памяти можно сократить. Нам достаточно одной матрицы размерности N. Все обновления расстояний мы будем осуществлять именно в ней.

Отметим, что при наличии в графе циклов отрицательного веса существуют кратчайшие пути сколь угодно малого веса. Имеет место следующий критерий: в графе есть циклы отрицательного веса тогда и только тогда, когда для некоторого i .

Задача 2

Дан взвешенный ориентированный граф из N вершин. Требуется найти в нем величину кратчайшего пути между каждой парой вершин.

Входные данные:

В первой строке записано натуральное число . В каждой из следующих N строк записано по N чисел — матрица весов дуг графа. Все веса представляют собой целые неотрицательные числа, не превосходящие 1000. Если в матрице в i-й строке j-м столбце стоит 0, то это означает, что дуги из вершины i в вершину j нет.

Выходные данные:

В выходной файл надо вывести матрицу кратчайших путей между каждой парой вершин графа (т.е. матрицу у которой в i-й строке j-м столбце стоит длина кратчайшего пути из вершины i в вершину j или 0 — если пути из i в j не существует).

  1. import java.io.PrintWriter;

  2. import java.util.Arrays;

  3. import java.util.Scanner;

  4. public class Solution {

  5. private static final int INF = 1000 * 1000 * 1000; //в качестве условной бесконечности выберем достаточно большое число 10^9

  6. public static void main(String[] args) {

  7. Solution solution = new Solution();

  8. solution.solve(); //вызываем процедуру решения задачи

  9. }

  10. private void solve() {

  11. Scanner scanner = new Scanner(System.in);//для считывания воспользуемся классом Scanner

  12. PrintWriter printWriter = new PrintWriter(System.out); //для считывания воспользуемся классом PrintWriter

  13. int vertexCount = scanner.nextInt(); //cчитываем число вершин графа

  14. int[][] g = new int[vertexCount][vertexCount]; //граф будем хранить в матрице смежности

  15. for (int i = 0; i < vertexCount; i++) {

  16. for (int j = 0; j < vertexCount; j++) {

  17. g[i][j] = scanner.nextInt(); //считываем вес ребра между вершинами i и j соответственно

  18. if (g[i][j] == 0) {

  19. g[i][j] = INF; //по условию если g[i][j] = 0, то это означает, что дуги из i в j нет; в этом случае расстояние между этими вершинами бесконечно велико

  20. }

  21. }

  22. }

  23. for (int k = 0; k < vertexCount; k++) {

  24. for (int i = 0; i < vertexCount; i++) {

  25. for (int j = 0; j < vertexCount; j++) { // Согласно алгоритму будем обновлять ответ для каждой пары вершин i и j, перебирая промежуточную вершину k

  26. g[i][j] = Math.min(g[i][j], g[i][k] + g[k][j]);

  27. }

  28. }

  29. }

  30. for (int i = 0; i < vertexCount; i++) {

  31. for (int j = 0; j < vertexCount; j++) {

  32. if (g[i][j] == INF) {

  33. printWriter.print(0 + " ");

  34. }

  35. else {

  36. printWriter.print(g[i][j] + " "); //для каждой пары вершин выведем величину кратчайшего пути от i до j, или 0, если j не достижима из i

  37. }

  38. }

  39. printWriter.println();

  40. }

  41. scanner.close(); //закрытие потока ввода

  42. printWriter.close(); //закрытие потока вывода

  43. }

  44. }

Заключение

В ходе написания курсовой работы мною были раскрыты профессиональные задачи, которые можно решить, используя графы. Данная тема широко применяется в обыденной жизни человека: в работе GPS, коммутации информационных пакетов в сетях и прочее.

При написании курсового проекта мною была изучена специальная литература, включающая в себя статьи и учебники, описаны теоретические аспекты и раскрыты ключевые понятия исследования, рассмотрено практическое применение графов.

Также эта тема будет важна не только для преподавателей ВУЗов и школ, но также и их учеников, так как данный раздел интенсивно развивается в информационном обществе.

Список использованной литературы

Источники на русском языке

  1. Ананий В. Левитин. Алгоритмы: введение в разработку и анализ. – М.: «Вильямс», 2006.

  2. Асельдеров З.М., Донец Г.А. Представление и восстановление графов – К.: Наукова Думка, 1991.

  3. Басакер Р., Саати Т. Конечные графы и сети. – М.: Наука, 1974.

  4. Зыков А. А. Основы теории графов. – М.: «Вузовская книга», 2004.

  5. Касьянов В. Н., Евстигнеев В.А. Графы в программировании: обработка, визуализация и применение. – СПб.: БХВ-Петербург, 2003.

  6. Оре О. Теория графов. – 2-е изд. – М.: Наука, 1980.

  7. Харари Ф. Теория графов. – М.: КомКнига, 2006 

Электронные ресурсы

  1. Википедия: Граф [электронный ресурс]: URL: http://ru.wikipedia.org/wiki/Граф_(математика)

  2. Википедия: Теория графов [электронный ресурс]: URL: http://ru.wikipedia.org/wiki/Теория_графов

  3. Сиберн: Алгоритм Беллмана-Форда [электронный ресурс]: URL: http://cybern.ru/algoritm-forda-bellmana.html

  4. Сиберн: Алгоритм Флойда-Уоршелла [электронный ресурс]: URL: http://cybern.ru/algoritm-flojda-uorshella.html