Скачать презентацию Программирование и структуры данных 2007 г Лекция 15 Скачать презентацию Программирование и структуры данных 2007 г Лекция 15

Лекция 15.ppt

  • Количество слайдов: 20

Программирование и структуры данных 2007 г. Лекция 15 ОБХОД ГРАФОВ Бикмурзина А. Р. КГТУ Программирование и структуры данных 2007 г. Лекция 15 ОБХОД ГРАФОВ Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 1

Программирование и структуры данных 2007 г. Обход графов Задачи: 1. Определить вершины, достижимые от Программирование и структуры данных 2007 г. Обход графов Задачи: 1. Определить вершины, достижимые от заданной. 2. Проверить, есть ли путь между двумя заданными вершинами. 3. Определить, есть ли циклы в графе. 4. Определить число компонент связности в графе. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 2

Программирование и структуры данных 2007 г. Пример графа Бикмурзина А. Р. КГТУ (КАИ), кафедра Программирование и структуры данных 2007 г. Пример графа Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 3

Программирование и структуры данных 2007 г. Решение задачи 4 // Глобальные данные #define NMAX Программирование и структуры данных 2007 г. Решение задачи 4 // Глобальные данные #define NMAX 20 // макс. число вершин int n; // число вершин графа int visit [NMAX] = {0}; /* вектор посещенных вершин */ int g[NMAX]; // м-ца смежности Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 4

Программирование и структуры данных 2007 г. // Главная функция (фрагмент) int k =0; // Программирование и структуры данных 2007 г. // Главная функция (фрагмент) int k =0; // счетчик компонент связности int v; // очередная вершина // обход всех компонент связности for (v=0; v

Программирование и структуры данных 2007 г. Обход в глубину Бикмурзина А. Р КГТУ (КАИ), Программирование и структуры данных 2007 г. Обход в глубину Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 6

Программирование и структуры данных 2007 г. • Последовательность посещения вершин: 0, 1, 2, 6, Программирование и структуры данных 2007 г. • Последовательность посещения вершин: 0, 1, 2, 6, 7, 8. • Подпрограмма обхода графа в глубину может быть рекурсивной и не рекурсивной (итеративной). Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 7

Программирование и структуры данных 2007 г. /* Итеративная функция обхода графа в глубину, начиная Программирование и структуры данных 2007 г. /* Итеративная функция обхода графа в глубину, начиная с вершины v */ void round (int v) /* Глоб. данные: g [NMAX] – м-ца смежности, n – число вершин, visit [NMAX] – вектор посещ. вершин */ { int st [NMAX]; // стек int us = 0; // указатель стека int i, j; // индексы строки и столбца м-цы смеж. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 8

Программирование и структуры данных 2007 г. st[0] = v; visit [v ] = 1; Программирование и структуры данных 2007 г. st[0] = v; visit [v ] = 1; while (us >=0) // стек не пуст { i = st [us]; /* просмотр i-й строки м-цы смежности и поиск 1 -й непосещенной вершины, смежной с i */ for (j=0; j

Программирование и структуры данных 2007 г. /* Рекурсивная функция обхода графа в глубину, начиная Программирование и структуры данных 2007 г. /* Рекурсивная функция обхода графа в глубину, начиная с вершины v */ void round (int v) /* Глоб. данные: g [NMAX] – м-ца смежности, n – число вершин, visit [NMAX] – вектор посещ. вершин */ { int w; // очередная вершина visit [v] = 1; Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 10

Программирование и структуры данных 2007 г. for (w=0; w<n; w++) if (g[v][w] == 1) Программирование и структуры данных 2007 г. for (w=0; w

Программирование и структуры данных 2007 г. Обход в ширину • Обход выполняется, начиная с Программирование и структуры данных 2007 г. Обход в ширину • Обход выполняется, начиная с заданной вершины, по уровням: • сначала посещается заданная вершина, • затем – вершины на расстоянии 1 от нее, • затем – вершины на расстоянии 2, 3 и т. д. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 12

Программирование и структуры данных 2007 г. • Расстояние между двумя вершинами – это длина Программирование и структуры данных 2007 г. • Расстояние между двумя вершинами – это длина (количество ребер) кратчайшего пути между вершинами. • Обход в ширину позволяет получить кратчайшие пути от заданной вершины до остальных. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 13

Программирование и структуры данных 2007 г. Обход в ширину одной компоненты связности графа Бикмурзина Программирование и структуры данных 2007 г. Обход в ширину одной компоненты связности графа Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 14

Программирование и структуры данных 2007 г. • Последовательность посещения вершин: 0, 1, 7, 8, Программирование и структуры данных 2007 г. • Последовательность посещения вершин: 0, 1, 7, 8, 2, 6. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 15

Программирование и структуры данных 2007 г. /* Функция обхода графа в ширину, начиная с Программирование и структуры данных 2007 г. /* Функция обхода графа в ширину, начиная с вершины v */ void round (int v) /* Глоб. данные: g [NMAX] – м-ца смежности, n – число вершин, visit [NMAX] – вектор посещ. вершин */ { int och [NMAX]; /* очередь вершин на посещение */ int in, ik; // индексы начала и конца очереди int w; // очередная вершина in = ik = 0; // инициализация очереди Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 16

Программирование и структуры данных 2007 г. och [ik++] = v; visit [v ] = Программирование и структуры данных 2007 г. och [ik++] = v; visit [v ] = 1; do { /* посещение вершины, первой в очереди, и удаление ее из очереди */ v = och [in++]; /* поиск непосещенных смежных с v вершин и добавление их в очередь */ for (w = 0; w

Программирование и структуры данных 2007 г. Поиск кратчайших путей в графе • В векторе Программирование и структуры данных 2007 г. Поиск кратчайших путей в графе • В векторе visit можно хранить дерево кратчайших путей от каждой вершины до начальной (дуги направлены к корню). Для этого в элемент visit [w] следует записывать не 1, а вершину v, предшествующую вершине w в дереве кратчайших путей. До обхода вектор visit нужно заполнить -1, а не нулями. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 18

Программирование и структуры данных 0 visit 1 2 3 2007 г. 4 5 6 Программирование и структуры данных 0 visit 1 2 3 2007 г. 4 5 6 7 8 0 0 1 -1 -1 -1 1 0 0 Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 19

Программирование и структуры данных 2007 г. Изменения в функции обхода round 1. visit[v] = Программирование и структуры данных 2007 г. Изменения в функции обхода round 1. visit[v] = v; // вместо visit[v]=1; 2. if (g[v][w] && visit[w] == -1) 3. visit[w] = v; // вместо visit[w]=1; Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 20