Blog Archive

Tuesday, February 14, 2017

Depth First Traversal or DFS for a Graph

Reference:

http://www.geeksforgeeks.org/depth-first-traversal-for-a-graph/





// C++ program to print DFS traversal for a given given graph

#include<iostream>

#include<list>

#include<algorithm>

using namespace std;



class Graph

{

    int V;    // No. of vertices

    list<int> *adj;    // Pointer to an array containing adjacency lists

    void DFSUtil(int v, bool visited[]);  // A function used by DFS

public:

    Graph(int V);   // Constructor

    void addEdge(int v, int w);   // function to add an edge to graph

    void DFS();    // prints DFS traversal of the complete graph

    void DFS(int v);

};



Graph::Graph(int V)

{

    this->V = V;

    adj = new list<int>[V];

}



void Graph::addEdge(int v, int w)

{

    adj[v].push_back(w); // Add w to v’s list.

}



void Graph::DFSUtil(int v, bool visited[])

{

    // Mark the current node as visited and print it

    visited[v] = true;

    cout << v << " ";



    // Recur for all the vertices adjacent to this vertex

    list<int>::iterator i;

    for(i = adj[v].begin(); i != adj[v].end(); ++i)

        if(!visited[*i])

            DFSUtil(*i, visited);

}



// DFS traversal of the vertices reachable from v.

// It uses recursive DFSUtil()

void Graph::DFS(int v)

{

    // Mark all the vertices as not visited

    bool *visited = new bool[V];

    for (int i = 0; i < V; i++)

        visited[i] = false;



    // Call the recursive helper function to print DFS traversal

    // starting from specified vertix v

    DFSUtil(v, visited);

}





// The function to do DFS traversal. It uses recursive DFSUtil()

void Graph::DFS()

{

    // Mark all the vertices as not visited

    bool *visited = new bool[V];

    for (int i = 0; i < V; i++)

        visited[i] = false;



    // Call the recursive helper function to print DFS traversal

    // starting from all vertices one by one

    for (int i = 0; i < V; i++){

        std::fill_n(visited, V, false); //reset all elements to false

        if (visited[i] == false){

            cout<<"starting node="<<i<<":";

            DFSUtil(i, visited);      

        }

        cout<<endl;

     }

}





int main()

{

    // Create a graph given in the above diagram

    const int V = 4;

    Graph g(V);

    g.addEdge(0, 1);

    g.addEdge(0, 2);

    g.addEdge(1, 2);

    g.addEdge(2, 0);

    g.addEdge(2, 3);

    g.addEdge(3, 3);



    cout << "\nFollowing is DFS Traversal result when tarting at node 2:\n";

    g.DFS(2);

    cout << "\nFollowing is DFS Traversal result when starting at each node 0~"<< V<<":\n";

    g.DFS( );





    return 0;

}



//Result is:

Following is DFS Traversal result when tarting at node 2:

2 0 1 3

Following is DFS Traversal result when starting at each node 0~4:

starting node=0:0 1 2 3

starting node=1:1 2 0 3

starting node=2:2 0 1 3

starting node=3:3



'via Blog this'

No comments:

Post a Comment