diff --git a/lemon/bfs.h b/lemon/bfs.h
--- a/lemon/bfs.h
+++ b/lemon/bfs.h
@@ -1035,21 +1035,78 @@
     ///\return \c true if \c t is reachable form \c s.
     bool run(Node s, Node t)
     {
-      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
-      if (Base::_pred)
-        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
-      if (Base::_dist)
-        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
-      if (Base::_reached)
-        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
-      if (Base::_processed)
-        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
-      alg.run(s,t);
-      if (Base::_path)
-        *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
-      if (Base::_di)
-        *Base::_di = alg.dist(t);
-      return alg.reached(t);
+      if ((Base::_pred || Base::_path) && (Base::_dist || Base::_di)) {
+        // Default PredMap and DistMap
+        Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
+        if (Base::_pred)
+          alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
+        if (Base::_dist)
+          alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
+        if (Base::_reached)
+          alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
+        if (Base::_processed)
+          alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
+        alg.run(s,t);
+        if (Base::_path)
+          *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
+        if (Base::_di)
+          *Base::_di = alg.dist(t);
+        return alg.reached(t);
+      }
+      else if (Base::_pred || Base::_path) {
+        // Use NullMap as DistMap
+        typedef NullMap<typename Digraph::Node, int> NullDistMap;
+        Bfs<Digraph,TR>::SetDistMap<NullDistMap>::Create
+          alg(*reinterpret_cast<const Digraph*>(Base::_g));
+        NullDistMap map;
+        alg.distMap(map);
+        if (Base::_pred)
+          alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
+        if (Base::_reached)
+          alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
+        if (Base::_processed)
+          alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
+        alg.run(s,t);
+        if (Base::_path)
+          *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
+        return alg.reached(t);
+      }
+      else if (Base::_dist || Base::_di) {
+        // Use NullMap as PredMap
+        typedef NullMap<typename Digraph::Node, typename Digraph::Arc>
+          NullPredMap;
+        Bfs<Digraph,TR>::SetPredMap<NullPredMap>::Create
+          alg(*reinterpret_cast<const Digraph*>(Base::_g));
+        NullPredMap map;
+        alg.predMap(map);
+        if (Base::_dist)
+          alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
+        if (Base::_reached)
+          alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
+        if (Base::_processed)
+          alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
+        alg.run(s,t);
+        if (Base::_di)
+          *Base::_di = alg.dist(t);
+        return alg.reached(t);
+      }
+      else {
+        // Use NullMap as PredMap and DistMap
+        typedef NullMap<typename Digraph::Node, int> NullDistMap;
+        typedef NullMap<typename Digraph::Node, typename Digraph::Arc>
+          NullPredMap;
+        Bfs<Digraph,TR>::SetDistMap<NullDistMap>::SetPredMap<NullPredMap>
+          ::Create alg(*reinterpret_cast<const Digraph*>(Base::_g));
+        NullDistMap dmap;
+        NullPredMap pmap;
+        alg.distMap(dmap).predMap(pmap);
+        if (Base::_reached)
+          alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
+        if (Base::_processed)
+          alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
+        alg.run(s,t);
+        return alg.reached(t);
+      }
     }
 
     ///Runs BFS algorithm to visit all nodes in the digraph.
