Download - ГРАФЫ ИХ ПРЕДСТАВЛЕНИЕ В STL
ГРАФЫИХ ПРЕДСТАВЛЕНИЕ
В STL
u
Отделение
программной инженерии
группа 271 ПИ
Антонова Н.А.
G = <V, E>
множество вершин (vertices)
|V|=N
множество пар вершин – дуг (arcs)
|E|=M
ГРАФГРАФ
БИБЛИОТЕКАБИБЛИОТЕКА STLSTLSTANDARD 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() – удаляет элемент из вектора– …
на экране:
a b c d e f g h i j X X X
КОНТЕЙНЕРЫКОНТЕЙНЕРЫ
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 как посещенную и повторим шаг
…
ОСНОВНЫЕ АЛГОРИТМЫ ОСНОВНЫЕ АЛГОРИТМЫ НА ГРАФАХНА ГРАФАХ
BBreadthreadth-F-First irst SSearch earch Поиск в ширинуПоиск в ширину
метод анализа структуры графа, при котором каждый уровень полностью подвергается анализу до перехода к
следующему уровню
• Рассматриваются все вершины, связанные с текущей
• Выбирается та вершина, которая раньше была рассмотрена
•
• Структура данных – очередь
Depth-First SearchDepth-First SearchПоиск в глубинуПоиск в глубину
метод анализа структуры графа, при котором узлы анализируются
последовательно, по мере продвижения вглубь, а далее анализируются
ближайшие к стартовому
• Поиск начинается с некоторой фиксированной вершины v
• Рассматривается вершина u, смежная с v
• Если нет вершин, смежных с текущей, возврат к предыдущей (если эта вершина – v, то просмотр окончен)
• Структура данных – стек
СПАСИБО ЗА ВНИМАНИЕ!