1 / 26

Выполнила Тагирова Лиана 271 ПИ

Графы и их представление в STL. Выполнила Тагирова Лиана 271 ПИ. Что такое граф?. Граф или неориентированный граф G — это упорядоченная пара G = < V , E > , для которой выполнены следующие условия: V это множество вершин или узлов ,

mieko
Download Presentation

Выполнила Тагирова Лиана 271 ПИ

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Графы и их представление в STL Выполнила Тагирова Лиана 271 ПИ

  2. Что такое граф? Граф или неориентированный графG — это упорядоченная пара G = <V,E>, для которой выполнены следующие условия: • V это множество вершин или узлов, • E это множество пар (неупорядоченных) различных вершин, называемых рёбрами.

  3. Свойства графа: • Два ребра называются смежными, если они имеют общую концевую вершину. • Два ребра называются кратными, если множества их концевых вершин совпадают.

  4. Ориентированный граф • Ориентированный граф (сокращенно орграф) G — это упорядоченная пара G = <V,A>, для которой выполнены следующие условия: • V это множество вершин или узлов, • A это множество (упорядоченных) пар различных вершин, называемых дугами или ориентированными рёбрами. Дуга — это упорядоченная пара вершин (v,w), где вершину v называют началом, а w — концом дуги. Можно сказать, что дуга v w ведёт от вершины v к вершине w.

  5. Смешанный граф • Смешанный графG — это граф, в котором некоторые рёбра могут быть ориентированными, а некоторые — неориентированными. Записывается упорядоченной тройкой G= <V,E,A>, где V, E и A определены так же, как для ориентированного графа.

  6. Путь: виды и свойства • Путём (или цепью) в графе называют конечную последовательность вершин, в которой каждая вершина (кроме последней) соединена со следующей в последовательности вершин ребром.

  7. Путь: виды и свойства • Ориентированным путём в орграфе называют конечную последовательность вершин , для которой все пары являются (ориентированными) рёбрами. • Циклом называют путь, в котором первая и последняя вершины совпадают. При этом длиной пути (или цикла) называют число составляющих его рёбер. Заметим, что если вершины u и v являются концами некоторого ребра, то согласно данному определению, последовательность (u,v,u) является циклом. Чтобы избежать таких «вырожденных» случаев, вводят следующие понятия.

  8. Дополнительные характеристики графов Граф называется: • связным, если для любых вершин u,v есть путь из u в v. • сильно связным или ориентированно связным, если он ориентированный, и из любой вершины в любую другую имеется ориентированный путь. • деревом, если он связный и не содержит простых циклов.

  9. Представление графов

  10. Абстрактный граф в С++ • class Graph • { • public: • Graph (int numV_, bool directed_): numV(numV_), numE(0), • directed(directed_) {} • virtual ~Graph() {} • int V() const {return numV;} • int E() const {return numE;} • bool isDirected() const {return directed;} • virtual void insert(Edge) = 0; • virtual void remove (Edge) = 0; • virtual bool isEdge(int,int) const = 0; • protected: • int numV; • int numE; • bool directed; • };

  11. Представление графов • Матрица смежности • Список смежных вершин

  12. Матрица смежности • Матрица M размером NxN (N – мощность множества вершин V (|V|=N) • Элемент матрицы M[i,j] равен 1, если (i,j) – ребро и 0 – если нет.

  13. Класс vector Контейнер vector обеспечивает структуру данных непрерывной областью памяти. Это позволяет обеспечивает эффективный прямой доступ к любому элементу контейнера vector посредством операции индексирования []. Все алгоритмы STL могут работать с контейнером vector. Итераторы для vector обычно реализуются как указатели на элементы контейнера vector.

  14. Матрица смежности-реализация • class AdjMatrixGraph : public Graph • {public: • std::vector<std::vector<bool> > adj; // двухмерн. массив • AdjMatrixGraph(int numV_, bool directed_ = false) : • Graph(numV_, directed_) { • adj.resize(numV_); • for (int i = 0; i != numV; ++i) • adj[i] = std::vector<bool>(numV_, false); • } • void insert (Edge e) { • if (!adj[e.v][e.w]) { • adj[e.v][e.w] = true; • if (!directed) • adj[e.w][e.v] = true; • ++numE; • } • }

  15. Матрица смежности-реализация 2 • void remove (Edge e) { • if (adj[e.v][e.w]) { • adj[e.v][e.w] = false; • if (!directed) • adj[e.w][e.v] = false; • --numE; • } • }; • bool isEdge(int u, int v) const { • return adj[u][v]; • } • }

  16. Характеристики представления • Проверка на существование ребра isEdge(i,j) – O(1) • Перебор всех верших – O(n) • Перебор всех ребер - O(n2)

  17. Список смежных вершин • Представляет собой набор связных списков, в которых хранятся инцендентные соседи каждого ребра

  18. Реализация • class AdjListGraph : public Graph • { • public: • std::vector<std::list<int> > adj; • AdjListGraph(int numV_, bool directed_ = false) : • Graph(numV_, directed_), adj(numV_) {} • void insert(Edge e) { • if (!(0 <= e.v && e.v <= numV && 0 <= e.w && e.w < numV)) • throw "Invalid vertex"; • adj[e.v].push_back(e.w); • ++numE; • if (!directed) • adj[e.w].push_back(e.v); • }

  19. Реализация • void remove(Edge e) { • std::list<int>::iterator itr = • std::find(adj[e.v].begin(), adj[e.v].end(), e.w); • if (itr != adj[e.v].end()){ • adj[e.v].erase(itr); • --numE; • if (!directed) { • itr = std::find(adj[e.w].begin(), adj[e.w].end(), e.v); • adj[e.w].erase(itr); • } • } • } • bool isEdge(int u, int v) const { • std::list<int>::const_iterator itr = • std::find(adj[u].begin(), adj[u].end(), v); • return itr != adj[u].end(); • } • }

  20. Характеристики представления • isEdge (i,j) – O(|E|) • Перебор вершин - O(|E|) • Перебор всех ребер - O(|E|) • Обычно, |E|<<|V|2,поэтому чаще используют связный список смежных вершин

  21. Пример использования на задаче:

  22. Постановка задачи: Предположим, к примеру, что мы используем текстовые строки для кодирования названий городов и хотим сконструировать карту, где значения ребер графа — это расстояние между двумя соответствующими городами. Такой граф показан на рис.: Взвешенный граф

  23. Операторы инициализации графа:

  24. Можно использовать набор классических алгоритмов для обработки таких графов. Одним из примеров является алгоритм Дейкстры поиска кратчайшего пути. Требуется указать город, с которого начинается путь. При этом создается приоритетная очередь для пар расстояние/ город. Она инициализируется нулем для начального города. Приоритетная очередь содержит города в порядке от ближайшего до самого дальнего.

  25. При каждой итерации цикла мы извлекаем из очереди город. Если для него еще не найдено кратчайшего пути, записывается текущее расстояние и путем проверки графа вычисляется расстояние до соседних городов. Этот процесс продолжается до тех пор, пока не будет исчерпана приоритетная очередь.

  26. Список исрользованных материалов: • Лекции по курсу «Алгоритмы и структуры данных» • Г. Шилдт «Полный справочник по С++» • электронная энциклопедия «wikipedia.org» • http://www.freesource.info/

More Related