【发布时间】:2017-05-28 23:02:34
【问题描述】:
Michal Forisek 的 Dijkstra 算法的 C++11 实现确实可以非常快速且优雅地计算最短距离,而无需太多代码。但是我怎样才能返回路径呢?
struct edge
{
edge(const int _to, const int _len): to(_to), length(_len)
{
}
int to;
int length;
};
int dijkstra(const vector< vector<edge> > &graph, int source, int target) {
vector<int> min_distance( graph.size(), INT_MAX );
min_distance[ source ] = 0;
set< pair<int,int> > active_vertices;
active_vertices.insert( {0,source} );
while (!active_vertices.empty()) {
int where = active_vertices.begin()->second;
if (where == target) return min_distance[where];
active_vertices.erase( active_vertices.begin() );
for (auto ed : graph[where])
if (min_distance[ed.to] > min_distance[where] + ed.length) {
active_vertices.erase( { min_distance[ed.to], ed.to } );
min_distance[ed.to] = min_distance[where] + ed.length;
active_vertices.insert( { min_distance[ed.to], ed.to } );
}
}
return INT_MAX;
}
int main()
{
std::vector<edge> node0 {edge(1,1), edge (3,7), edge (2,1)};
std::vector<edge> node1 {edge(0,1), edge (2,2), edge (3,4)};
std::vector<edge> node2 {edge(1,2), edge (3,3), edge (0,1)};
std::vector<edge> node3 {edge(2,3), edge (0,7), edge (1,4)};
std::vector<std::vector<edge>> graph {node0, node1, node2, node3};
int r = dijkstra(graph, 0, 3);
return 0;
}
【问题讨论】:
标签: c++ algorithm c++11 dijkstra