2頂点間のパス存在テスト in Boost.Graph

http://lists.boost.org/MailArchives/boost/msg74721.php
(boost.devel 2004/11/15)
うにゅぅ.あんまりそういう目的(単にlong jumpするため)に例外を使いたくないんだよにゃ〜.いや楽なのは分かるし,ちゃんとやろうとするとdepth_first_visit/breadth_first_visitに代わるもの(特定の条件で呼び出し元に戻るようなdepth/breadth_first_visit)が要るんだけれど.

struct find_target_vertex
{
};

template<class Graph>
class is_achievable_visitor :
  public boost::default_dfs_visitor
{
private:
  typedef Graph graph_type;
  typedef
    typename boost::graph_traits<graph_type>::vertex_descriptor
    vertex_type
    ;

public:
  is_achievable_visitor(vertex_type target) :
    target_(target)
  {
  }

  void discover_vertex(vertex_type u, graph_type const &) const
  {
    if(u == target_){
      throw find_target_vertex();
    }
  }

private:
  vertex_type target_;
};

// グラフgにおいて頂点uから頂点vへのパスが存在するかどうかを深さ優先で探索する
// vertex_indexはvertex_descriptorを[0, |V|)のユニークな整数値にmapするproperty map
template<class Vertex, class Graph, class VertexIndexPropertyMap>
bool is_achievable(Vertex u, Vertex v, Graph const &g,
                   VertexIndexPropertyMap vertex_index)
{
  typedef boost::default_color_type color_t;

  std::vector<color_t> color_map(
    num_vertices(g), boost::color_traits<color_t>::white());

  try{
    boost::depth_first_visit(
      g, u, is_achievable_visitor<Graph>(v),
      boost::make_iterator_property_map(color_map.begin(), vertex_index))
      ;
  }
  catch(find_target_vertex){
    return true;
  }
  return false;
}

というか,それ以前にproperty_map, visitor, 各種traitsなどのBGL特有のイディオムを知らないとただの暗号の羅列にしか見えないっちゅーのはどうにかならんのだろうか・・・.