關於註釋中的問題:
- 根據例子VC++的源代碼的註釋有一些問題與named parameter mechanism used。因此,我認爲兩個分支的基本原理都與VC++版本基本相同,只是更加冗長(儘管如此,我沒有深入到足以肯定100%)。
- A
property_map
將頂點/邊緣映射到與特定頂點/邊緣關聯的附加數據。例如。示例中的weightmap
將權重(旅行成本)與每個邊相關聯。
predecessor_map
用於記錄所有頂點(對於記錄根路徑上的前導者的每個頂點)的路徑。至於爲什麼需要它:那麼這些信息是人們經常希望擺脫算法的東西。
參數清楚地列在description中。注意兩個版本,一個帶有命名參數,另一個沒有(後來在VC++中使用)。
現在
了幾分一步的the documentation給出的示例代碼的步驟(請注意,我從來沒有實際使用Boost.Graph,所以這是對正確性沒有保證,我也只包括了相關的部分和省略#if
爲VC++):
const int num_nodes = 5;
//names of graph nodes
enum nodes { A, B, C, D, E };
char name[] = "ABCDE";
//edges of the graph
Edge edge_array[] = { Edge(A, C), Edge(B, B), Edge(B, D), Edge(B, E),
Edge(C, B), Edge(C, D), Edge(D, E), Edge(E, A), Edge(E, B)
};
//weights/travelling costs for the edges
int weights[] = { 1, 2, 1, 2, 7, 3, 1, 1, 1 };
int num_arcs = sizeof(edge_array)/sizeof(Edge);
//graph created from the list of edges
graph_t g(edge_array, edge_array + num_arcs, weights, num_nodes);
//create the property_map from edges to weights
property_map<graph_t, edge_weight_t>::type weightmap = get(edge_weight, g);
//create vectors to store the predecessors (p) and the distances from the root (d)
std::vector<vertex_descriptor> p(num_vertices(g));
std::vector<int> d(num_vertices(g));
//create a descriptor for the source node
vertex_descriptor s = vertex(A, g);
//evaluate dijkstra on graph g with source s, predecessor_map p and distance_map d
//note that predecessor_map(..).distance_map(..) is a bgl_named_params<P, T, R>, so a named parameter
dijkstra_shortest_paths(g, s, predecessor_map(&p[0]).distance_map(&d[0]));
正如我在評論中提到我個人認爲lemon更直觀地再使用Boost.Graph,所以也許你可能想給那看看,而不是
後的內容的一些示例你已經嘗試過,沒有工作糟透了。 – Wug 2012-07-30 17:53:54
「..他們的例子和文檔」 - 你使用的是誰的例子和文檔? – hatchet 2012-07-30 17:56:16
@hatchet:我認爲它是http://www.boost.org/doc/libs/1_38_0/libs/graph/example/dijkstra-example.cpp – 2012-07-30 17:56:41