![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Class adjIterator
{ public: adjlterator(const GRAPH &, int); Edge *beg(); Edge *nxt(); bool end(); }; };
Часть 5. Алгоритмы на графах
Программа 20.2. Пример клиентской функции обработки графа_______________________ Данная функция служит иллюстрацией использования интерфейса взвешенного графа, предложенного нами в программе 20.1. При любой реализации этого интерфейса функция edges возвращает вектор, содержащий указатели на все ребра графа. Как и в главах 17-19, мы в общем случае используем функцию итератора только так, как показано здесь. template < class Graph, class Edge> vector < Edge *> edges(const Graph & G) { int E = 0; vector < Edge *> a (G.E ()); for (int v = 0; v < G.V(); v++) { typename Graph:: adjIterator A(G, v); for (Edge* e = A.beg();! A.end(); e = A.nxt()) if (e-> from(v)) a[E++] = e; } return a; }
(представление в виде матрицы смежности)___________________________________ Для насыщенных взвешенных графов мы используем матрицу указателей на данные типа Edge с указателем на ребро в v-u в строке v и столбце w. Для неориентированных графов мы устанавливаем другой указатель на ребро в строке w и столбце v. Нулевой указатель свидетельствует об отсутствии соответствующего ребра; когда мы удаляем ребро с помощью функции remove(), мы удаляем указатель на него. Рассматриваемая реализация не производит проверки на наличие параллельных ребер, в то же время клиенты могут для этой цели воспользоваться функцией edge. template < class Edge> class DenseGRAPH { int Vcnt, Ecnt; bool digraph; vector < vector < Edge *> > ad j; public: DenseGRAPH(int V, bool digraph = false): adj(V), Vcnt(V), Ecnt(O), digraph(digraph) { for (int i = 0; i < V; i++) adj[i].assign(V, 0); } int V() const { return Vcnt; } int E() const { return Ecnt; } bool directed() const { return digraph; } void insert(Edge *e) { int v = e-> v(), w = e-> w(); if (adj[v][w] == 0) Ecnt++; adj[v][w] =е; if (! digraph) adj [w] [v] = e; } void remove(Edge *e) { int v = e-> v(), w =e-> w(); if (adj[v][w]! = 0) Ecnt--; adj[v][w] - 0; Глава 20. Минимальные остовные деревья
{ return adj[v][w]; } class adjIterator; friend class adjlterator; };
|