Реализация взвешенного BFS для поиска кратчайшего пути

Я использую список смежности, и моя функция addEdge выглядит так:

void Graph::addEdge(int start, int end, int weight)
{
    adj[start].push_back(end); 
}

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


person user2963379    schedule 09.12.2014    source источник


Ответы (1)


Вы можете определить класс для хранения как веса, так и конечной точки ребра:

class Edge
{
  public:
    int endpoint;
    int weight;
};

Естественно, это потребует модификации вашего графика; adj нужно будет хранить Edges, а не ints. Если это невозможно, вы можете сопоставить края с весами следующим образом:

std::vector<std::vector<int> > edgeWeights;

так что для данного ребра u-v edgeWeights[u][v] является весом ребра u-v.

Точно так же вы также можете сопоставить пары (т.е. ребра) с весами:

std::map<std::pair<int, int>, int> edgeWeights;

Возможности безграничны.

person sdzivanovich    schedule 09.12.2014
comment
Я бы предпочел использовать структуру, а не класс (набирать на одно слово меньше;)), но помимо этого мне нравится ваш ответ. - person MikeMB; 09.12.2014
comment
Итак, я решил создать структуру Edge. Однако как мне подойти к методу addEdge? Мне пришлось бы создать временный объект Edge, установить цель и вес, но тогда как он узнает, с чем связаны эти цель и вес? - person user2963379; 09.12.2014