Я должен реализовать диграф (Ориентированный граф) в C++ как часть домашней работы, и у меня есть некоторые проблемы с тем, как представить граничные типы данных и вершины.
Кто-либо может указать на меня на пример или простой класс C++, который реализует это так, я могу изучить его и расшириться оттуда?
Я погуглил некоторое время, но я только нашел результаты об использовании Повышения или других библиотек, мне просто нужно что-то простое, которое не полагается ни на какую библиотеку.
Спасибо.
Существует два основных способа представления диграфов с структурами данных:
узел Itric . Этот метод представляет каждый узлы как объект в вашей программе, и каждый узел содержит информацию о других узлах, которые она ссылается. Другие узлы могут быть максимально простыми, как список узлов, где существует направленный край между текущим узлом и целевым узлом.
Грант границ . Этот метод представляет собой каждый край как объект в вашей программе, и каждый край содержит информацию о том, какие узлы соединяются. В Digraph каждое преимущество будет иметь ровно один «источник» и «назначение» узла (который может быть одним и тем же узлом, если вы рассматриваете себя как петли). Этот метод по существу является списком упорядоченных пар.
В зависимости от решения проблемы, которую вы решаете, одна из этих двух основных форм завершится наиболее подходящими. Более конкретные алгоритмы могут потребоваться добавить дополнительную информацию в вышеуказанные основные структуры, например, в список всех узлов, достижимых из текущего узла.
Попробуйте вектор
с помощью MultiMap
.
MultiMAP
не поддерживает подписку [x]
, поэтому вам нужно использовать EDGES.lower_Bound ()
.
В качестве альтернативы, A карта
может помочь искать край, заданные два узла. Я имел имя, что в одной довольно тяжелой программе.
Вот пример для первого предложения:
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 простых способа представления графов:
У каждого есть преимущества / недостатки, в зависимости от приложения.
# 2 будет вовлекать много указателя.
# 1 часто легче использовать при выполнении графовых преобразований.
В одном из них у вас будет что-то подобное:
template<typename T>
class node
{
public:
T data;
};
и матрица и список классов списка будут указывать на динамически выделенные узла
.
Последствия состоит в том, что у вас будет диаграмма
класс и класс
класс.
template<class T>
class node
{
public:
T data;
vector<node<T>*> edges;
}
Вы, скорее всего, также хотите хранить список
всех узлов.
Это Университетская бумага может помочь вам.
Это не самый полный, но это дает вам идею, возможно. Я нашел это довольно полезным, это также для лекции, поэтому нет риска копирования чего угодно.