ГРАФЫ
ИХ ПРЕДСТАВЛЕНИЕ
В STL
u
Отделение
программной инженерии
группа 271 ПИ
. .Антонова Н А
G = <V, E>
множество вершин
(vertices)
|V|=N
множество –пар вершин
дуг (arcs)
|E|=M
ГРАФГРАФ
БИБЛИОТЕКАБИБЛИОТЕКА STLSTL
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() – удаляет элемент из вектора
– …
:на экране
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-Firstirst SSearchearch
Поиск в ширинуПоиск в ширину
метод анализа структуры графа, при
котором каждый уровень полностью
подвергается анализу до перехода к
следующему уровню
• Рассматриваются все вершины, связанные
с текущей
• Выбирается та вершина, которая раньше
была рассмотрена
•
• Структура данных – очередь
Depth-First SearchDepth-First Search
Поиск в глубинуПоиск в глубину
метод анализа структуры графа, при
котором узлы анализируются
последовательно, по мере продвижения
вглубь, а далее анализируются
ближайшие к стартовому
• Поиск начинается с некоторой
фиксированной вершины v
• Рассматривается вершина u, смежная с v
• Если нет вершин, смежных с текущей,
возврат к предыдущей (если эта вершина
– v, то просмотр окончен)
• Структура данных – стек
СПАСИБО ЗА
!ВНИМАНИЕ

6.0a

  • 1.
    ГРАФЫ ИХ ПРЕДСТАВЛЕНИЕ В STL u Отделение программнойинженерии группа 271 ПИ . .Антонова Н А
  • 2.
    G = <V,E> множество вершин (vertices) |V|=N множество –пар вершин дуг (arcs) |E|=M ГРАФГРАФ
  • 3.
    БИБЛИОТЕКАБИБЛИОТЕКА STLSTL STANDARD TEMPLATELIBRARY стандартная библиотека шаблонов Это библиотека шаблонов и функций С++, включающая в себя различные контейнеры ( , ,данных список очередь , , -множество отображение хэш ,таблица очередь с )приоритетами и базовые ( , )алгоритмы сортировка поиск
  • 4.
    Последовательные Ассоциативные (линейный список) (–ключ значение)• list • vector • deque • … КОНТЕЙНЕРЫКОНТЕЙНЕРЫ • map • multimap • set • …
  • 5.
    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] << “ “; КОНТЕЙНЕРЫКОНТЕЙНЕРЫ
  • 6.
    VECTOR – динамическиймассив – size() – возвращает текущий размер вектора – begin() – ,возвращает итератор установленный на начало вектора – end() - ,возвращает итератор установленный на конец вектора – push_back() – записывает значение в конец вектора – insert() – ,записывает значение непосредственно перед элементом на который ссылается итератор – erase() – удаляет элемент из вектора – … :на экране a b c d e f g h i j X X X КОНТЕЙНЕРЫКОНТЕЙНЕРЫ
  • 7.
    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; КОНТЕЙНЕРЫКОНТЕЙНЕРЫ
  • 8.
    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 КОНТЕЙНЕРЫКОНТЕЙНЕРЫ
  • 9.
    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' КОНТЕЙНЕРЫКОНТЕЙНЕРЫ
  • 10.
    , ,Вершины соединенныедугой называются смежными , ,Дуги имеющие общую вершину также называются смежными Дуга и любая из ее вершин называются инцидентными СМЕЖНОСТЬ иСМЕЖНОСТЬ и ИНЦИДЕНТНОСТЬИНЦИДЕНТНОСТЬ
  • 11.
    ПРЕДСТАВЛЕНИЕПРЕДСТАВЛЕНИЕ ГРАФОВГРАФОВ 1. Матрица смежности 2.Матрица инциденций 3. Структуры смежности 4. Массив дуг
  • 12.
    Это двумерный массивразмером NxN, где N – мощность множества вершин V (|V|=N) МАТРИЦАМАТРИЦА СМЕЖНОСТИСМЕЖНОСТИ //двумерный массив #include <vector> typedef std::vector< std::vector< bool > > Matrix; Matrix m;
  • 13.
    МАТРИЦАМАТРИЦА ИНЦИДЕНЦИЙИНЦИДЕНЦИЙ Это двумерный массивразмером 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
  • 14.
    Это одномерный массивразмером 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;
  • 15.
    Это двумерный массивразмером Мx2, где М – мощность множества ребер Е (|Е|=М) МАССИВ ДУГМАССИВ ДУГ //map #include <map> typedef std::map< int, int > Matrix; Matrix m;
  • 16.
    Использование в прикладныхИспользованиев прикладных задачахзадачах • Географические карты и маршруты • Расписания (scheduling) • Web (гипертекст) • Сети (networks) и т.д.
  • 17.
    Сеть европейских железныхдорог ПОИСК КРАТЧАЙШЕГОПОИСК КРАТЧАЙШЕГО ПУТИПУТИ
  • 18.
    ПУТЬПУТЬ Путь – последовательностьвершин, соединенных ребрами Длина пути – число ребер(невзвешенная) или сумма весов всех ребер (взвешенная), входящих в путь
  • 19.
  • 20.
    АЛГОРИТМАЛГОРИТМ ДЕЙКСТРЫДЕЙКСТРЫИнициализация Метка начальной вершиныполагается равной 0, метки остальных вершин — бесконечности (расстояния до них пока неизвестны) Шаг алгоритма • Если все вершины посещены, алгоритм завершается • В противном случае из еще не посещенных вершин выбирается вершина U, имеющая минимальную метку • Рассматриваются все смежные к ней вершины. Для каждой из них определяется новая длина пути, равную сумме текущей метки U и длины ребра, их соединяющего • Если полученная длина меньше метки новой вершины, заменим метку этой длиной • Рассмотрев все такие вершины, пометим вершину U как посещенную и повторим шаг …
  • 22.
  • 23.
    BBreadthreadth-F-Firstirst SSearchearch Поиск вширинуПоиск в ширину метод анализа структуры графа, при котором каждый уровень полностью подвергается анализу до перехода к следующему уровню
  • 24.
    • Рассматриваются всевершины, связанные с текущей • Выбирается та вершина, которая раньше была рассмотрена • • Структура данных – очередь
  • 28.
    Depth-First SearchDepth-First Search Поискв глубинуПоиск в глубину метод анализа структуры графа, при котором узлы анализируются последовательно, по мере продвижения вглубь, а далее анализируются ближайшие к стартовому
  • 29.
    • Поиск начинаетсяс некоторой фиксированной вершины v • Рассматривается вершина u, смежная с v • Если нет вершин, смежных с текущей, возврат к предыдущей (если эта вершина – v, то просмотр окончен) • Структура данных – стек
  • 33.