单源最短路径,不用说一定是经典的
dijkstra
算法了。dijkstra
的原始版本做到了很好的解决问题,但是还有进一步优化的空间。
接下来展示通过“优先级队列(priority_queue)”优化时间复杂度的方法。
首先把图的类定义出来,我采用的是“class Edge”+”class Graph”的定义方案,将有向边和图的实现抽离,如有不妥,方请指正:
template<typename Type>
class Edge
{
template<typename Type>
friend class Graph;
public:
explicit Edge(const size_t& start, const size_t& end = 0, const Type& value = Type())
:start_idx(start), end_idx(end), value(value), flag(Flags::unvisited) {}
size_t getEnd() const { return end_idx; }
size_t getValue() const { return value; }
~Edge() = default;
private:
size_t start_idx;
size_t end_idx;
Type value;
Flags flag; // search for next_edge unvisied edge.
};
template<typename Type>
class Graph
{
using Node = vector<Edge<Type>>;
int INFTY = (1 << 20);
public:
Graph() :
num_edges(0) {}
explicit Graph(const size_t& size);
~Graph() = default;
// some other functions.
// return iterator points to the specific edge.
decltype(auto) findEdge(const size_t& vertex_idx, const size_t& end) const;
void addEdge(