Вы можете определить структуру Edge
как
struct Edge
{
int destination;
int weight;
};
И создать график как
vector<vector<Edge> > graph;
Затем, чтобы получить доступ ко всем ребрам из вершины u
, вы пишете что-то вроде
for( int i = 0; i < graph[u].size(); ++i ) {
Edge edge = graph[u][i];
// here edge.destination and edge.weight give you some details.
}
Вы можете динамически добавлять новые ребра, например ребро из 3-й вершины в 7-е с весом 8:
Edge newEdge;
newEdge.destination = 7;
newEdge.weight = 8;
graph[3].push_back( newEdge );
и т.д.
Для неориентированных графов, конечно, не забудьте добавить симметричное ребро.
Это должно быть хорошо.
Редактировать
Выбор базовых контейнеров (std::vector
, std::list
, std::map
) зависит от варианта использования, например, что вы делаете с графиком чаще: добавление / удаление вершин / ребер, просто обход. Как только ваш график создан, либо std::list
, либо std::vector
одинаково хороши для Дейкстры, std::vector
- немного быстрее благодаря схеме последовательного доступа стадии релаксации.