Write a program that for a given graph outputs a vertices of

Write a program that, for a given graph, outputs:

a. vertices of each connected component

b. its cycle or a message that the graph is acyclic

Solution

The below code is written in C++ prgogramming Language:

class my_graph
{
int num_vert; // No. of vertices
list<int> *adj; // An array of adjacency lists

void fillOrder(int v, bool visited[], stack<int> &g_stack); // to fill the vertices into stack

void DFSUtil(int v, bool visited[]); // function to output DFS begining from v
bool is_cyclicUtil(int v, bool visited[], bool *rs); // function to check cyclic or not, used by is_cyclic

public:
my_graph(int v);
void addEdge(int v, int w);

void get_connects(); // function to find and get the connected components of directed graph
my_graph get_trans(); // Function that returns transpose of my_graph
bool is_cyclic(); // main function to check for cyclic or acyclic
};


my_graph::my_graph(int v)
{
num_vert = v;
adj = new list<int>[v];
}

void my_graph::addEdge(int v, int w)
{
adj[v].push_back(w); // Add w to v’s list.
}

void my_graph::fillOrder(int v, bool visited[], stack<int> &g_stack)
{
// Mark the current node as visited and print it
visited[v] = true;

// Recur for all the vertices adjacent to given vertex
list<int>::iterator itr;
for(itr = adj[v].begin(); itr != adj[v].end(); ++itr)
if(!visited[*itr])
fillOrder(*itr, visited, g_stack);
g_stack.push(v);
}

// This function finds and prints all strongly connected components
void my_graph::get_connects()
{
stack<int> g_stack;

// Mark all the vertices as not visited (For first DFS)
bool *visited = new bool[num_vert];
for(int itr = 0; itr < num_vert; itr++)
visited[itr] = false;

// Fill vertices in stack according to their finishing times
for(int itr = 0; itr < num_vert; itr++)
if(visited[itr] == false)
fillOrder(itr, visited, g_stack);

// Create a reversed graph
my_graph graph = get_trans();

// Mark all the vertices as not visited (For second DFS)
for(int itr = 0; itr < num_vert; itr++)
visited[itr] = false;

// Now process all vertices in order defined by g_stack
while (g_stack.empty() == false)
{
// Pop a vertex from stack
int v = g_stack.top();
g_stack.pop();

// Print Strongly connected component of the popped vertex
if (visited[v] == false)
{
graph.DFSUtil(v, visited);
cout << endl;
}
}
}

// A recursive function to print DFS starting from v
void my_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 itr;
for (itr = adj[v].begin(); itr != adj[v].end(); ++itr)
if (!visited[*itr])
DFSUtil(*itr, visited);
}

my_graph my_graph::get_trans()
{
my_graph g(num_vert);
for (int j = 0; j < num_vert; j++)
{
// Recur for all the vertices adjacent to this vertex
list<int>::iterator itr;
for(itr = adj[j].begin(); itr != adj[v].end(); ++itr)
{
g.adj[*itr].push_back(j);
}
}
return g;
}



// Utility function which is used by is_cyclic.
bool my_graph::is_cyclicUtil(int v, bool visited[], bool *recg_stack)
{
if(visited[v] == false)
{
// Mark the current node as visited and part of recursion stack
visited[v] = true;
recg_stack[v] = true;

// Recur for all the vertices adjacent to this vertex
list<int>::iterator itr;
for(itr = adj[v].begin(); itr != adj[v].end(); ++itr)
{
if ( !visited[*itr] && is_cyclicUtil(*itr, visited, recg_stack) )
return true;
else if (recg_stack[*itr])
return true;
}
}
recg_stack[v] = false;
  
return false;
}

// This function checks for cyclic or not. if cyclic return true, else false

bool my_graph::is_cyclic()
{
// First, mark all the vertices as not visited and not part of recursion stack
bool *visited = new bool[num_vert];
bool *recg_stack = new bool[num_vert];
for(int j = 0; j < num_vert; j++)
{
visited[j] = false;
recg_stack[j] = false;
}

for(int j = 0; j < num_vert; j++)
if (is_cyclicUtil(j, visited, recg_stack))
return true;

return false;
}

----------------------------------

Note: Test function is not written for this.

Write a program that, for a given graph, outputs: a. vertices of each connected component b. its cycle or a message that the graph is acyclicSolutionThe below c
Write a program that, for a given graph, outputs: a. vertices of each connected component b. its cycle or a message that the graph is acyclicSolutionThe below c
Write a program that, for a given graph, outputs: a. vertices of each connected component b. its cycle or a message that the graph is acyclicSolutionThe below c

Get Help Now

Submit a Take Down Notice

Tutor
Tutor: Dr Jack
Most rated tutor on our site