ГРАФЫ ИХ ПРЕДСТАВЛЕНИЕ В STL Отделение программной инженерии группа 271 ПИ Антонова Н.А. ГРАФ G = <V, E> множество вершин (vertices) |V|=N множество пар вершин – дуг (arcs) |E|=M БИБЛИОТЕКА STL STANDARD TEMPLATE LIBRARY стандартная библиотека шаблонов Это библиотека шаблонов и функций С++, включающая в себя различные контейнеры данных (список, очередь, множество, отображение, хэштаблица, очередь с приоритетами) и базовые алгоритмы (сортировка, поиск) КОНТЕЙНЕРЫ Последовательные (линейный список) • list • vector • deque •… Ассоциативные (ключ – значение) • map • multimap • set •… КОНТЕЙНЕРЫ VECTOR – динамический массив – – – – – size() – возвращает текущий размер вектора begin() – возвращает итератор, установленный на начало вектора end() - возвращает итератор, установленный на конец вектора push_back() – записывает значение в конец вектора insert() – записывает значение непосредственно перед элементом, на который ссылается итератор – erase() – удаляет элемент из вектора – … vector<char> iv; //пустой вектор int i; //счетчик for (i=0; i<10; i++) v[i] = i + ’a’; //заполнение //устанавливаем итератор в конец vector<char>::iterator p=v.end(); v.insert (p,3,’X’); //вставляем три символа Х в вектор //выводим на экран содержимое вектора for (i=0; i<v.size(); i++) cout<< v[i] << “ “; КОНТЕЙНЕРЫ VECTOR – динамический массив – – – – – size() – возвращает текущий размер вектора begin() – возвращает итератор, установленный на начало вектора end() - возвращает итератор, установленный на конец вектора push_back() – записывает значение в конец вектора insert() – записывает значение непосредственно перед элементом, на который ссылается итератор – erase() – удаляет элемент из вектора – … на экране: abcdefghijXXX КОНТЕЙНЕРЫ SET – упорядоченные уникальные значения; MAP – ассоциативный контейнер: уникальный ключ – значение map<string, string> m1; //ключ и значение – строковый тип //заполнение: ключ-значение хранится с помощью стандартного типа пары m1.insert(pair<string, string>("apple", "a small red fruit")); m1.insert(pair<string, string>("orange", "a small orange fruit")); m1["banana"] = "a long yellow fruit"; //заполнение //вывод на экран вариант 1 map<string, string>::iterator it = m1.begin(); for ( ; it != m1.end(); it++) { cout << it->first << ": " << it->second << endl; } //вывод на экран вариант 2 cout << m1["apple"] << endl; cout << m1["orange"] << endl; cout << m1["banana"] << endl; КОНТЕЙНЕРЫ MAP – ассоциативный контейнер: уникальный ключ – значение на экране: apple: a small red fruit orange: a small orange fruit banana: a long yellow fruit a small red fruit a small orange fruit a long yellow fruit КОНТЕЙНЕРЫ MULTIMAP – ключ может иметь несколько значений PRIORITY_QUEUE – очередь с приоритетами priority_queue<int> pq; pq.push(1); //добавляем элемент pq.push(4); pq.push(2); cout << pq.top() << endl; // выводит '4' pq.pop(); // удаление элемента cout << pq.top() << endl; // выводит '2' pq.pop(); // удаление элемента cout << pq.top() << endl; // выводит '1' cout << pq.size() << endl; // выводит '1' СМЕЖНОСТЬ и ИНЦИДЕНТНОСТЬ Вершины, соединенные дугой, называются смежными Дуги, имеющие общую вершину, также называются смежными Дуга и любая из ее вершин называются инцидентными ПРЕДСТАВЛЕНИЕ ГРАФОВ 1. Матрица смежности 2. Матрица инциденций 3. Структуры смежности 4. Массив дуг МАТРИЦА СМЕЖНОСТИ Это двумерный массив размером NxN, где N – мощность множества вершин V (|V|=N) //двумерный массив #include <vector> typedef std::vector< std::vector< bool > > Matrix; Matrix m; МАТРИЦА ИНЦИДЕНЦИЙ Это двумерный массив размером NxМ, где N – мощность множества вершин V (|V|=N), М – мощность множества ребер (|E|=M) 1 2 3 4 5 6 7 8 1 1 0 0 0 1 0 0 0 2 0 0 1 0 1 0 0 0 3 0 0 1 1 0 0 0 0 4 0 1 0 1 0 0 0 1 5 0 0 0 0 0 0 0 1 6 1 0 0 0 0 0 1 0 7 0 0 0 0 0 1 1 0 8 0 0 0 0 0 1 0 0 9 0 1 0 0 0 0 0 0 СТРУКТУРА СМЕЖНОСТИ Это одномерный массив размером N, где N – мощность множества вершин V (|V|=N). Элемент массива – указатель на начало списка, где храниться перечень вершин, смежных с рассматриваемой struct node { int v; node* next; node (int x, node* t) { v = x; next = t; } }; typedef node* link; vector <link> adj; МАССИВ ДУГ Это двумерный массив размером Мx2, где М – мощность множества ребер Е (|Е|=М) //map #include <map> typedef std::map< int, int > Matrix; Matrix m; Использование в прикладных задачах • Географические карты и маршруты • Расписания (scheduling) • Web (гипертекст) • Сети (networks) и т.д. ПОИСК КРАТЧАЙШЕГО ПУТИ Сеть европейских железных дорог ПУТЬ Путь – последовательность вершин, соединенных ребрами Длина пути – число ребер(невзвешенная) или сумма весов всех ребер (взвешенная), входящих в путь ПРЕДСТАВЛЕНИЕ map<string, list<Service*> > outgoing_services; map<string, City*> cities; АЛГОРИТМ ДЕЙКСТРЫ Инициализация Метка начальной вершины полагается равной 0, метки остальных вершин — бесконечности (расстояния до них пока неизвестны) … Шаг алгоритма • Если все вершины посещены, алгоритм завершается • В противном случае из еще не посещенных вершин выбирается вершина U, имеющая минимальную метку • Рассматриваются все смежные к ней вершины. Для каждой из них определяется новая длина пути, равную сумме текущей метки U и длины ребра, их соединяющего • Если полученная длина меньше метки новой вершины, заменим метку этой длиной • Рассмотрев все такие вершины, пометим вершину U как посещенную и повторим шаг ОСНОВНЫЕ АЛГОРИТМЫ НА ГРАФАХ Breadth-First Search Поиск в ширину метод анализа структуры графа, при котором каждый уровень полностью подвергается анализу до перехода к следующему уровню • Рассматриваются все вершины, связанные с текущей • Выбирается та вершина, которая раньше была рассмотрена • • Структура данных – очередь Depth-First Search Поиск в глубину метод анализа структуры графа, при котором узлы анализируются последовательно, по мере продвижения вглубь, а далее анализируются ближайшие к стартовому • Поиск начинается с некоторой фиксированной вершины v • Рассматривается вершина u, смежная с v • Если нет вершин, смежных с текущей, возврат к предыдущей (если эта вершина – v, то просмотр окончен) • Структура данных – стек СПАСИБО ЗА ВНИМАНИЕ!