Example Depth First Seach and Breadth First SearchThe following example shows how to use the LEDA functions for DFS and BFS. The program first creates a graph  
#include <LEDA/graph/graph.h>
#include <LEDA/graph/basic_graph_alg.h>
using namespace leda;
int main()
{
  graph G; 
  node n0=G.new_node();node n1=G.new_node();
  node n2=G.new_node();node n3=G.new_node();
  node n4=G.new_node();node n5=G.new_node();
  node n6=G.new_node();
  G.new_edge(n5,n0);G.new_edge(n5,n1);
  G.new_edge(n5,n2);G.new_edge(n1,n3);
  G.new_edge(n4,n6);
      The first variant of DFS uses a node_array<bool> 
      reached to label the nodes that are reached from the starting node 
      n5 with true. This variant returns the list 
      of reached nodes. The nodes appear in this list in the order they were visited. 
      Our program outputs the list for G and n5. 
      
  //first variant of DFS
  node_array<bool> reached(G,false); 
             //DFS expects value false for all nodes
  list<node> LN1=DFS(G,n5,reached);
  
  node v;
  std::cout << "LN1:";forall(v,LN1) G.print_node(v);
  std::cout << std::endl << std::endl; //prints LN1:[5][0][1][3][2]
      The second variant of DFS, called DFS_NUM(), numbers the nodes 
      of G in two different ways. The node_array<int> 
      dfsnum is a numbering with respect to the calling time and node_array<int> 
      compnum is a numbering with respect to the completion time of the 
      recursive calls. DFS_NUM() returns a DFS forest, that is, a 
      list of tree edges that lead to reachable nodes. We print dfsnum, 
      compnum and the list of tree edges. 
      
  //second variant of DFS
  node_array<int> dfsnum(G);
  node_array<int> compnum(G);
  list<edge> LE=DFS_NUM(G,dfsnum,compnum);
    //start nodes for BFS are chosen in order of creation
	   
  forall_nodes(v,G) {
    G.print_node(v);
    std::cout << " dfsnum[v]=" << dfsnum[v];
    std::cout << " compnum[v]=" << compnum[v] << std::endl;
  }
  edge e;
  std::cout << "LE: ";forall(e,LE) G.print_edge(e);
  std::cout << std::endl << std::endl; //prints LE: [1]---->[3][4]---->[6]
      The first variant of BFS uses a node_array<int> dist1 
      for the result of a Breadth First Search on G starting at node 
      n5. After the call of BFS() we have dist[v]=-1 
      for nodes v not reachable from n5. For the other 
      nodes v dist[v] is the distance from n5 
      to v in G. The list of visited nodes is 
      returned. The nodes appear in this list in the order they were visited. 
      Our program outputs the dist values of all nodes and the list of visited 
      nodes for G and n5. 
      
  //first variant of BFS
  node_array<int> dist1(G,-1);   
                     //BFS expects value -1 for all nodes
  list<node> LN2=BFS(G,n5,dist1);
  forall_nodes(v,G) {
    G.print_node(v);
    std::cout << " dist1[v]=" << dist1[v] << std::endl;
  }  //dist1[v]=-1 for [4],[6], dist1[v]=0 for [5], 
     //dist1[v]=1 for [0],[1],[2], dist1[v]=2 for [3]
  std::cout << "LN2: ";
  forall(v,LN2) G.print_node(v);
  std::cout << std::endl << std::endl; // prints LN2: [5][0][1][2][3]
      The second variant of BFS extends the first variant by a node_array<edge> 
      pred that contains for every node v of G 
      the edge that was used by BFS to reach v or nil 
      if v is unreachable from s. pred 
      corresponds to the list of edges returned by DFS_NUM(). We 
      output pred and the list of reached nodes. 
      
  //second variant of BFS
  node_array<int> dist2(G,-1);
                    //BFS expects value -1 for all nodes
  node_array<edge> pred(G);
  list<node> LN3=BFS(G,n5,dist2,pred);
  forall_nodes(v,G) {
    G.print_node(v);
    std::cout << " dist2[v]=" << dist2[v] << " ";
    if (pred[v]!=nil) G.print_edge(pred[v]);
    std::cout << std::endl;
  }  //dist2[v]=dist1[v] for all v-1 for [4],[6]
     //pred[[0]]=[5]---->[0]  pred[[1]]=[5]---->[1]
     //pred[[2]]=[5]---->[2]  pred[[3]]=[1]---->[3]
     //pred[v]=nil for [4],[5],[6]
  std::cout << "LN3: ";
  forall(v,LN3) G.print_node(v);
  std::cout << std::endl << std::endl; // prints LN3: [5][0][1][2][3]
  return 0;
}
      Remark: The graph algorithms in LEDA are generic, that is, they accept 
      graphs as well as parameterized 
      graphs.  | 
     
      See also:Manual Entries:  |