Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

write a C++ program that reads in a graphs adjacency matrix from an input file a

ID: 3664298 • Letter: W

Question

write a C++ program that reads in a graphs adjacency matrix from an input file and detects whether there is a Cycle in that graph or not(prints "yes there is a cycle" if so and "no theres no cycle" if not)

please write the code in a way that i can understand it(name the variables appropriately and comment please)

input files to work with:

file number 1:

0 1 0 0 0 1 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 1 0 0 0 1 0
0 0 0 1 0 0 0 1
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0

file number 2:

0 0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0 1
0 0 0 1 0 0 0 0 0
0 1 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0
1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0

file number 3:

0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1 0 0 0 0 0 1 0

thanks so much

Explanation / Answer

// A C++ Program to detect cycle in a graph
#include<iostream>
#include <list>
#include <limits.h>

using namespace std;

class Graph
{
   int V; // No. of vertices
   list<int> *adj; // Pointer to an array containing adjacency lists
   bool isCyclicUtil(int v, bool visited[], bool *rs); // used by isCyclic()
public:
   Graph(int V); // Constructor
   void addEdge(int v, int w); // to add an edge to graph
   bool isCyclic(); // returns true if there is a cycle in this graph
};

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.
}

// This function is a variation of DFSUytil() in http://www.geeksforgeeks.org/archives/18212
bool Graph::isCyclicUtil(int v, bool visited[], bool *recStack)
{
   if(visited[v] == false)
   {
       // Mark the current node as visited and part of recursion stack
       visited[v] = true;
       recStack[v] = true;

       // 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] && isCyclicUtil(*i, visited, recStack) )
               return true;
           else if (recStack[*i])
               return true;
       }

   }

recStack[v] = false; // remove the vertex from recursion stack
   return false;
}

// Returns true if the graph contains a cycle, else false.
// This function is a variation of DFS() in http://www.geeksforgeeks.org/archives/18212
bool Graph::isCyclic()
{
   // Mark all the vertices as not visited and not part of recursion
   // stack
   bool *visited = new bool[V];
   bool *recStack = new bool[V];
   for(int i = 0; i < V; i++)
   {
       visited[i] = false;
       recStack[i] = false;
   }

   // Call the recursive helper function to detect cycle in different
   // DFS trees
   for(int i = 0; i < V; i++)

if (isCyclicUtil(i, visited, recStack))
           return true;

   return false;
}

int main()
{
   // Create a graph given in the above diagram
   Graph g(4);
   g.addEdge(0, 1);
   g.addEdge(0, 2);
   g.addEdge(1, 2);
   g.addEdge(2, 0);
   g.addEdge(2, 3);
   g.addEdge(3, 3);

if(g.isCyclic())
       cout << "Graph contains cycle";
   else
       cout << "Graph doesn't contain cycle";
   return 0;
}