Реализация ориентированного графа

Я должен реализовать диграф (Ориентированный граф) в C++ как часть домашней работы, и у меня есть некоторые проблемы с тем, как представить граничные типы данных и вершины.
Кто-либо может указать на меня на пример или простой класс C++, который реализует это так, я могу изучить его и расшириться оттуда?

Я погуглил некоторое время, но я только нашел результаты об использовании Повышения или других библиотек, мне просто нужно что-то простое, которое не полагается ни на какую библиотеку.

Спасибо.

7
задан Coral Doe 27 September 2012 в 07:26
поделиться

5 ответов

Существует два основных способа представления диграфов с структурами данных:

узел Itric . Этот метод представляет каждый узлы как объект в вашей программе, и каждый узел содержит информацию о других узлах, которые она ссылается. Другие узлы могут быть максимально простыми, как список узлов, где существует направленный край между текущим узлом и целевым узлом.

Грант границ . Этот метод представляет собой каждый край как объект в вашей программе, и каждый край содержит информацию о том, какие узлы соединяются. В Digraph каждое преимущество будет иметь ровно один «источник» и «назначение» узла (который может быть одним и тем же узлом, если вы рассматриваете себя как петли). Этот метод по существу является списком упорядоченных пар.

В зависимости от решения проблемы, которую вы решаете, одна из этих двух основных форм завершится наиболее подходящими. Более конкретные алгоритмы могут потребоваться добавить дополнительную информацию в вышеуказанные основные структуры, например, в список всех узлов, достижимых из текущего узла.

29
ответ дан 6 December 2019 в 05:38
поделиться

Попробуйте вектор с помощью MultiMap .

MultiMAP не поддерживает подписку [x] , поэтому вам нужно использовать EDGES.lower_Bound () .

В качестве альтернативы, A карта , EDGETTYYPE> может помочь искать край, заданные два узла. Я имел имя, что в одной довольно тяжелой программе.

Вот пример для первого предложения:

struct NodeType {
    int distance;
    NodeType( int d ) { distance = d; }
};
struct EdgeType  {
    int weight;
    NodeType *link;
    EdgeType( int w, NodeType *l ) { weight = w; link = l }
};

vector< NodeType > nodes;
nodes.reserve( 3 );
nodes.push_back( NodeType( 0 ) );
nodes.push_back( NodeType( 0 ) );
nodes.push_back( NodeType( 0 ) );

multimap< NodeType *, EdgeType > edges;
edges.insert( make_pair( &nodes[0], EdgeType( 4, &nodes[2] ) ) );
edges.insert( make_pair( &nodes[0], EdgeType( 1, &nodes[1] ) ) );
edges.insert( make_pair( &nodes[2], EdgeType( 2, &nodes[0] ) ) );

for ( multimap< NodeType *, EdgeType >::iterator iter = edges.lower_bound( &nodes[1] ),
  end = edges.upper_bound( &nodes[1] ); iter != end; ++ iter ) {
    cerr << "1 connects to " << iter->second.link - nodes.begin() << endl;
}
2
ответ дан 6 December 2019 в 05:38
поделиться

Свободно, есть 2 простых способа представления графов:

  1. Matrix соединения
  2. Список списков.

У каждого есть преимущества / недостатки, в зависимости от приложения.

# 2 будет вовлекать много указателя.

# 1 часто легче использовать при выполнении графовых преобразований.

В одном из них у вас будет что-то подобное:

template<typename T>
class node
{
   public:
   T data;
};

и матрица и список классов списка будут указывать на динамически выделенные узла .

Последствия состоит в том, что у вас будет диаграмма класс и класс класс.

3
ответ дан 6 December 2019 в 05:38
поделиться
template<class T>
class node
{
public:
    T data;
    vector<node<T>*> edges;
}

Вы, скорее всего, также хотите хранить список *> всех узлов.

0
ответ дан 6 December 2019 в 05:38
поделиться

Это Университетская бумага может помочь вам.

Это не самый полный, но это дает вам идею, возможно. Я нашел это довольно полезным, это также для лекции, поэтому нет риска копирования чего угодно.

0
ответ дан 6 December 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: