
Лекция 15.ppt
- Количество слайдов: 20
Программирование и структуры данных 2007 г. Лекция 15 ОБХОД ГРАФОВ Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 1
Программирование и структуры данных 2007 г. Обход графов Задачи: 1. Определить вершины, достижимые от заданной. 2. Проверить, есть ли путь между двумя заданными вершинами. 3. Определить, есть ли циклы в графе. 4. Определить число компонент связности в графе. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 2
Программирование и структуры данных 2007 г. Пример графа Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 3
Программирование и структуры данных 2007 г. Решение задачи 4 // Глобальные данные #define NMAX 20 // макс. число вершин int n; // число вершин графа int visit [NMAX] = {0}; /* вектор посещенных вершин */ int g[NMAX]; // м-ца смежности Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 4
Программирование и структуры данных 2007 г. // Главная функция (фрагмент) int k =0; // счетчик компонент связности int v; // очередная вершина // обход всех компонент связности for (v=0; v
Программирование и структуры данных 2007 г. Обход в глубину Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 6
Программирование и структуры данных 2007 г. • Последовательность посещения вершин: 0, 1, 2, 6, 7, 8. • Подпрограмма обхода графа в глубину может быть рекурсивной и не рекурсивной (итеративной). Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 7
Программирование и структуры данных 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; while (us >=0) // стек не пуст { i = st [us]; /* просмотр i-й строки м-цы смежности и поиск 1 -й непосещенной вершины, смежной с i */ for (j=0; j
Программирование и структуры данных 2007 г. /* Рекурсивная функция обхода графа в глубину, начиная с вершины v */ void round (int v) /* Глоб. данные: g [NMAX] – м-ца смежности, n – число вершин, visit [NMAX] – вектор посещ. вершин */ { int w; // очередная вершина visit [v] = 1; Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 10
Программирование и структуры данных 2007 г. for (w=0; w
Программирование и структуры данных 2007 г. Обход в ширину • Обход выполняется, начиная с заданной вершины, по уровням: • сначала посещается заданная вершина, • затем – вершины на расстоянии 1 от нее, • затем – вершины на расстоянии 2, 3 и т. д. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 12
Программирование и структуры данных 2007 г. • Расстояние между двумя вершинами – это длина (количество ребер) кратчайшего пути между вершинами. • Обход в ширину позволяет получить кратчайшие пути от заданной вершины до остальных. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 13
Программирование и структуры данных 2007 г. Обход в ширину одной компоненты связности графа Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 14
Программирование и структуры данных 2007 г. • Последовательность посещения вершин: 0, 1, 7, 8, 2, 6. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 15
Программирование и структуры данных 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 ] = 1; do { /* посещение вершины, первой в очереди, и удаление ее из очереди */ v = och [in++]; /* поиск непосещенных смежных с v вершин и добавление их в очередь */ for (w = 0; w
Программирование и структуры данных 2007 г. Поиск кратчайших путей в графе • В векторе visit можно хранить дерево кратчайших путей от каждой вершины до начальной (дуги направлены к корню). Для этого в элемент visit [w] следует записывать не 1, а вершину v, предшествующую вершине w в дереве кратчайших путей. До обхода вектор visit нужно заполнить -1, а не нулями. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 18
Программирование и структуры данных 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] = v; // вместо visit[v]=1; 2. if (g[v][w] && visit[w] == -1) 3. visit[w] = v; // вместо visit[w]=1; Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 20