我有一个由邻接列表表示的图表。我为它应用了depth_first_visit算法。一切都很好。 问题是算法只访问与我的起点顶点连接的顶点。如果我有单独的顶点(没有任何连接),则不会遍历它们。 当然,我已经通过查找未访问的顶点然后从它们启动算法来解决了这个问题,但是在文档中写出了那些“分离的”顶点也应该被遍历。问题 - 我做错了吗?
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, Vertex, Edge > GraphType;
vector<default_color_type> color_map(num_vertices(m_graph));
depth_first_visit(
m_graph,
*vp.first,
custom_dfs_visitor(m_currentPath, visited),
make_iterator_property_map(
color_map.begin(),
get(vertex_index, m_graph),
color_map[0]),
Terminator(m_currentPath)
);
答案 0 :(得分:1)
“如果图形断开连接,DFS将不会访问其所有顶点。有关详细信息,请参阅查找连接组件算法。” 参考:Algolist
你没有做错任何事。而你的修复(找到其他未访问的节点,再次启动算法)就是其他实现所做的。
作为进一步明显的证据,请查看此excellent implementation on TimL's page。您可以继续单击并观察正在执行的DFS。 (向下滚动到页面中间。)
答案 1 :(得分:1)
看起来您的算法是正确的,因为这实际上是DFS的作用:它遍历所有连接的节点,这意味着您需要分别在每个连接的组件上运行它。根据您的使用情况,您可能需要查看用于查找连接组件的算法,这些算法使用某种DFS或BFS算法。