Справочник от Автор24
Поделись лекцией за скидку на Автор24

Кратчайшие расстояния на графах

  • 👀 340 просмотров
  • 📌 287 загрузок
Выбери формат для чтения
Статья: Кратчайшие расстояния на графах
Найди решение своей задачи среди 1 000 000 ответов
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Конспект лекции по дисциплине «Кратчайшие расстояния на графах» pdf
Дисциплина «Алгоритмы и структуры данных» Лекция № 11 Кратчайшие расстояния на графах Филатов Вячеслав Валерьевич к.т.н., доцент кафедры КБ-2 «Прикладные информационные технологии» Пример использования матричной формы представления графа: обнаружение цепей и циклов Задача: определить, существует ли цепь длины k из вершины i в вершину j (или цикл длиной k из вершины i в нее саму). 1 2 3 1 1 1 2 1 1 3 1 1 A = 2 3 Произвольная цепь длиной 2 (k=2)будет, если A[i][0]=1 и A[i][1]=1 и A[i][2]=1 и A[i][3]=1 и строка i логическое умножение A[0][j]=1или A[1][j]=1 или A[2][j]=1 или A[3][j]=1 столбец j логическое сложение Пример использования матричной формы представления графа: обнаружение цепей и циклов Задача: определить, существует ли цепь длины k из вершины i в вершину j (или цикл длиной k из вершины i в нее саму). 1 2 3 1 1 1 2 1 1 3 1 1 A = 2 3 A[i][0]=1 * A[i][1]=1 * A[i][2]=1 * A[i][3]=1 * A[0][j]=1 A[1][j]=1 A[2][j]=1 A[3][j]=1 = A * A = A2, т.е. Aк + + + = Пример использования матричной формы представления графа: обнаружение цепей и циклов Логическое умножение матрицы на себя: 1 M2 = M  M матрица путей длины 2 M2 = 2 1 1 1 1 1  1 2 3 1 1 1 1 =1 1 1 1 2 1 1 3 1 3 M2[2][0] = 0·0 + 1·1 + 0·0 + 1·1 = 1 маршрут 2-1-0 маршрут 2-3-0 Пример использования матричной формы представления графа: обнаружение цепей и циклов Матрица существования путей длины 3: M3 = M 2  M M3 = M4 = 1 1 1 1 1 1 1 1 1 1 1   2 1 2 3 1 1 1 1 1 1 1 1 2 1 1 3 1 1 1 2 3 1 1 1 = 1 1 1 1 2 1 1 1 3 1 = 1 3 на главной диагонали – циклы! Пример использования матричной формы представления графа: обнаружение цепей и циклов: Cохранение информации о цепях и циклов длиной не более k 1 Логическое сложение матрицы на себя (k>1): k Mk = Mk-1 or M M2 = 1 1 1 1 1  2 1 2 3 1 1 1 1 =1 1 1 1 2 1 1 3 1 1 1 1 1 1 1 M2 = 1 1 1 1 1 2 1 1 1 1 1 1 3 1 1 1 1 or = 3 Пример использования матричной формы представления графа: достижимость узлов Пусть для графа G=(V,Е) имеется матрица смежности A: 1 только в том случае, если есть дуга i  j, (i,j) ∈ E a[i,j] = 0, если такой дуги не существует. Пример использования матричной формы представления графа: достижимость узлов Пусть для графа G=(V,Е) имеется матрица смежности A : 1 только в том случае, если есть дуга i  j, (i,j) ∈ E ; A[i,j] = 0, если такой дуги не существует. Мы хотим вычислить матрицу M такую, что 1, тогда и только тогда, когда ∃ путь от вершины i до вершины j M[i,j] = 0, в противном случае. Матрицу M часто называют транзитивным замыканием матрицы смежности A. Пример использования матричной формы представления графа: достижимость узлов (Алгоритм Уоршала) i j Задача: Требуется определить: достижим узел j из узла i, т.е. определить, существует ли на графе какой-либо путь (цепь) из узла i в узел j. Пример использования матричной формы представления графа: достижимость узлов (Алгоритм Уоршала) i j М[i][j] М[i][j] = М[i][j] or (М[i][k] and М[k][j]) Задача: Требуется определить: достижим узел j из узла i, т.е. определить, существует ли на графе какой-либо путь (цепь) из узла i в узел j. Пример использования матричной формы представления графа: достижимость узлов (Алгоритм Уоршала) i j М[i][j] М[i][j] = М[i][j] or (М[i][k] and М[k][j]) Задача: Требуется определить: достижим узел j из узла i, т.е. определить, существует ли на графе какой-либо путь (цепь) из узла i в узел j. Пример использования матричной формы представления графа: достижимость узлов (Алгоритм Уоршала) k i j М[i][j] М[i][j] = М[i][j] or (М[i][k] and М[k][j]) Задача: Требуется определить: достижим узел j из узла i, т.е. определить, существует ли на графе какой-либо путь (цепь) из узла i в узел j. Пример использования матричной формы представления графа: достижимость узлов (Алгоритм Уоршала) М[i][k] k М[k][j] i j М[i][j] М[i][j] = М[i][j] or (М[i][k] and М[k][j]) Задача: Требуется определить: достижим узел j из узла i, т.е. определить, существует ли на графе какой-либо путь (цепь) из узла i в узел j. Пример использования матричной формы представления графа: достижимость узлов (Алгоритм Уоршала) for ( k = 0; k < N; k ++ ) for ( i = 0; i < N; i ++ ) for ( j = 0; j < N; j ++ ) М[i][j] = М[i][j] or (М[i][k] and М[k][j]) М[i][k] k М[k][j] i j М[i][j] М[i][j] = М[i][j] or (М[i][k] and М[k][j]) Задача: Требуется определить: достижим узел j из узла i, т.е. определить, существует ли на графе какой-либо путь (цепь) из узла i в узел j. Пример использования матричной формы представления графа: достижимость узлов (Алгоритм Уоршала) for ( k = 0; k < N; k ++ ) for ( i = 0; i < N; i ++ ) for ( j = 0; j < N; j ++ ) М[i][j] = М[i][j] or (М[i][k] and М[k][j]); М[i][k] k М[k][j] i j М[i][j] М[i][j] = М[i][j] or (М[i][k] and М[k][j]) Задача: Требуется определить: достижим узел j из узла i, т.е. определить, существует ли на графе какой-либо путь (цепь) из узла i в узел j. Пример использования матричной формы представления графа: достижимость узлов (Алгоритм Уоршала) for ( k = 0; k < N; k ++ ) for ( i = 0; i < N; i ++ ) for ( j = 0; j < N; j ++ ) М[i][j] = М[i][j] or (М[i][k] and М[k][j]) М[i][k] k М[k][j] i j М[i][j] М[i][j] = М[i][j] or (М[i][k] and М[k][j]) Задача: Требуется определить: достижим узел j из узла i, т.е. определить, существует ли на графе какой-либо путь (цепь) из узла i в узел j. Пример использования матричной формы представления графа: достижимость узлов (Алгоритм Уоршала) for ( k = 0; k < N; k ++ ) for ( i = 0; i < N; i ++ ) for ( j = 0; j < N; j ++ ) М[i][j] = М[i][j] or (М[i][k] and М[k][j]); М[i][k] k М[k][j] i j М[i][j] Задача: Требуется определить: достижим узел j из узла i, т.е. определить, существует ли на графе какой-либо путь (цепь) из узла i в узел j. Пример использования матричной формы представления графа: нахождение попарных кратчайших расстояний (алгоритм Флойда-Уоршала) Задача: задана сеть дорог между городами, часть которых могут иметь одностороннее движение. Найти все кратчайшие расстояния, от каждого города до всех остальных городов. Пример использования матричной формы представления графа: нахождение попарных кратчайших расстояний (алгоритм Флойда-Уоршала) Определим матрицу кратчайших расстояний F[|V|][|V|]: F[i][j] – (кратчайшее) расстояние между узлом i и узлом j F[i][k] k F[k][j] i j F[i][j] Задача: задана сеть дорог между городами, часть которых могут иметь одностороннее движение. Найти все кратчайшие расстояния, от каждого города до всех остальных городов. Пример использования матричной формы представления графа: нахождение попарных кратчайших расстояний (алгоритм Флойда-Уоршала) Определим матрицу кратчайших расстояний F[|V|][|V|]: F[i][j] – (кратчайшее) расстояние между узлом i и узлом j F[i][k] k F[k][j] i j F[i][j] Если из вершины i в вершину j короче ехать через вершину k, мы едем через вершину k! Задача: задана сеть дорог между городами, часть которых могут иметь одностороннее движение. Найти все кратчайшие расстояния, от каждого города до всех остальных городов. Пример использования матричной формы представления графа: нахождение попарных кратчайших расстояний (алгоритм Флойда-Уоршала) for ( k = 0; k < N; k ++ ) for ( i = 0; i < N; i ++ ) for ( j = 0; j < N; j ++ ) F[i][j] = min(=F[i][j], (F[i][k] + F[k][j]) ) F[i][k] k F[k][j] i j F[i][j] Если из вершины i в вершину j короче ехать через вершину k, мы едем через вершину k! Задача: задана сеть дорог между городами, часть которых могут иметь одностороннее движение. Найти все кратчайшие расстояния, от каждого города до всех остальных городов. Пример использования матричной формы представления графа: нахождение попарных кратчайших расстояний (алгоритм Флойда-Уоршала) for ( k = 0; k < N; k ++ ) for ( i = 0; i < N; i ++ ) for ( j = 0; j < N; j ++ ) F[i][j] = F[i][j] > (F[i][k] + F[k][j]) ? (F[i][k] + F[k][j]) : F[i][j]; F[i][k] k + F[k][j] i j F[i][j] Если из вершины i в вершину j короче ехать через вершину k, мы едем через вершину k! Задача: задана сеть дорог между городами, часть которых могут иметь одностороннее движение. Найти все кратчайшие расстояния, от каждого города до всех остальных городов. Пример использования матричной формы представления графа: нахождение попарных кратчайших расстояний (алгоритм Флойда-Уоршала) for ( k = 0; k < N; k ++ ) for ( i = 0; i < N; i ++ ) for ( j = 0; j < N; j ++ ) if ( F[i][j] > F[i][k] + F[k][j] ) F[i][j] = F[i][k] + F[k][j]; F[i][k] k + F[k][j] i j F[i][j] Если из вершины i в вершину j короче ехать через вершину k, мы едем через вершину k! Задача: задана сеть дорог между городами, часть которых могут иметь одностороннее движение. Найти все кратчайшие расстояния, от каждого города до всех остальных городов. Пример использования матричной формы представления графа: нахождение попарных кратчайших расстояний (алгоритм Флойда-Уоршала) ! Нет информации о маршруте, только кратчайшие расстояния! for ( k = 0; k < N; k ++ ) for ( i = 0; i < N; i ++ ) for ( j = 0; j < N; j ++ ) if ( F[i][j] > F[i][k] + F[k][j] ) F[i][j] = F[i][k] + F[k][j]; F[i][k] k + F[k][j] i j F[i][j] Если из вершины i в вершину j короче ехать через вершину k, мы едем через вершину k! Задача: задана сеть дорог между городами, часть которых могут иметь одностороннее движение. Найти все кратчайшие расстояния, от каждого города до всех остальных городов. Нахождение попарных кратчайших расстояний (алгоритм Флойда-Уоршала) с указанием (сохранение) маршрута for ( i = 0; i < N; i ++ ) Признак дуги { for ( j = 0; j < N; j ++ ) {F[i,j]=C[i,j]; p[i][j] = -1; } F[i,i]=0; } «убираем» for ( k = 0; k < N; k ++ ) петли for ( i = 0; i < N; i ++ ) for ( j = 0; j < N; j ++ ) if ( F[i][j] > F[i][k] + F[k][j] ) { F[i][j] = F[i][k] + F[k][j]; p[i][j] = k; } Путь из i в j через k ? Какова сложность алгоритма? O(N3) Кратчайшие пути (алгоритм Дейкстры) Задача: задана сеть дорог между городами, часть которых могут иметь одностороннее движение. Найти кратчайшие расстояния от заданного города до всех остальных городов. Строго: Пусть дан связный граф G=(V,E) с N вершинами, веса ребер заданы матрицей С. Найти кратчайшие расстояния от заданной вершины (источника) до всех остальных. Алгоритм Дейкстры (E.W. Dijkstra, 1959) 4 9 6 5 расстояний) 2 11 3 2 14 9 15 10 7 1 1) присвоить всем вершинам метку unvisited, кроме источника. Отметить источник как visited. 2) для каждой вершины j хранить значение длины пути от источника до неё самой. (в начале алгоритма это значение равно … 3) … C[источник, j]. (инициализация массива кратчайших 4) среди нерассмотренных вершин найти вершину w с наименьшим значением в узле, отметить вершину w как посещенную; 5) для каждой необработанной вершины i: если путь к вершине i через вершину w меньше существующего в ней значения, заменить значение на новое расстояние,; 6) если остались необработанные вершины, то перейти к шагу 4; 26 7) значение в узле = минимальное расстояние. Алгоритм Дейкстры ∞ 5 14 2 ∞ 2 9 ∞ 4 9 11 7 11 9 4 2 9 9 2 ∞ 7 9 7 2 9 9 2 ∞ 14 7 4 20 11 7 7 2 9 15 1 7 4 20 9 6 2 9 9 2 7 3 20 11 15 10 3 22 11 10 7 14 15 1 9 2 5 3 20 11 6 10 3 ∞ 4 9 5 6 5 15 1 9 14 14 15 1 7 11 3 20 11 10 ∞ 11 10 2 6 5 14 9 2 15 1 14 ∞ ∞ 6 5 3 10 14 6 4 9 1 7 27 Реализация алгоритма Дейкстры Массивы: 1) массив mark, такой что mark[i]=1, если вершина уже рассмотрена, и mark[i]=0, если нет. 2) массив D, такой что D[i] – длина текущего кратчайшего пути из заданной вершины x в вершину i; 3) массив p, такой что p[i] – номер вершины, из которой нужно идти в вершину i в текущем кратчайшем пути. Инициализация: 1) заполнить массив mark нулями (вершины не обработаны); 2) записать в D[i] значение C[x][i], i=0..N-1; 3) заполнить массив p значением … 4) записать mark[x]=1, p[x]=… (нужно ли?). 4 9 14 6 5 14 2 9 9 2 11 7 3 15 10 ∞ 1 7 ∞ 1 2 3 4 5 mark 1 D 7 9 ∞ ∞ 14 p 28 Реализация алгоритма Дейкстры Массивы: 1) массив mark, такой что mark[i]=1, если вершина уже рассмотрена, и mark[i]=0, если нет. 2) массив D, такой что D[i] – длина текущего кратчайшего пути из заданной вершины x в вершину i; 3) массив p, такой что p[i] – номер вершины, из которой нужно идти в вершину i в текущем кратчайшем пути. Инициализация: 1) заполнить массив mark нулями (вершины не обработаны); 2) записать в D[i] значение C[x][i], i=0..N-1; 3) заполнить массив p значением p[i] = x; 4) записать mark[x]=1, p[x]= -1 (или p[x]= х) – признак 4 9 14 6 5 14 2 9 9 2 11 7 3 15 10 ∞ 1 7 ∞ источника 1 2 3 4 5 mark 1 D 7 9 ∞ ∞ 14 p 29 Реализация алгоритма Дейкстры Основной цикл: 1) если все вершины рассмотрены, то стоп. 2) среди всех нерассмотренных вершин (mark[i]=0) найти вершину w, для которой D[i] – минимальное; w = i; 3) записать mark[w]=1; 4) для всех непосещенных вершин j: если путь в вершину j через вершину w короче, чем найденный ранее кратчайший путь, т.е. D[w]+C[w][j] < D[j], то запоминаем его D[j]=D[w]+C[w][j] и p[j]=w. Шаг 1: 4 9 14 6 5 14 2 9 9 2 7 3 22 11 1 2 3 4 5 mark 1 1 D 7 9 22 ∞ 14 p 1 15 10 ∞ 1 7 30 Реализация алгоритма Дейкстры Шаг 2: 11 9 2 2 9 11 7 1 11 9 4 20 Шаг 3: 2 3 4 5 3 20 mark D 1 1 1 7 9 20 ∞ 11 p 2 2 1 2 3 4 5 mark 1 1 1 1 D 7 9 20 20 11 p 2 5 2 7 6 5 2 9 9 2 7 3 20 11 15 10 1 15 10 14 6 5 14 ∞ 4 9 1 7 ! Дальше массивы не изменяются! 31 Как вывести маршрут? Результат работа алгоритма Дейкстры: 1 2 3 4 5 mark 1 1 1 1 1 1 D 7 9 20 20 11 p 2 5 2 длины путей Маршрут из вершины 0 в вершину 4: 4 5 2 Вывод маршрута в вершину i (использование массива p): 1) установить z=i; 2) пока p[z]!=z: присвоить z=p[z] и вывести z Сложность алгоритма Дейкстры: два вложенных цикла по N шагов O(N2) 32 Спасибо за внимание!
«Кратчайшие расстояния на графах» 👇
Готовые курсовые работы и рефераты
Купить от 250 ₽
Решение задач от ИИ за 2 минуты
Решить задачу
Найди решение своей задачи среди 1 000 000 ответов
Найти

Тебе могут подойти лекции

Смотреть все 938 лекций
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot