граф библиотека stl

advertisement
ГРАФЫ
ИХ ПРЕДСТАВЛЕНИЕ
В 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, то просмотр окончен)
• Структура данных – стек
СПАСИБО ЗА ВНИМАНИЕ!
Download