#ifndef CYCLE_DETECTOR_H #define CYCLE_DETECTOR_H #include #include #include #include typedef unsigned TimeStamp; typedef std::vector Edges; typedef std::vector CyclicEdges; class Node { public: enum StatusType { NotVisited, BeingVisited, DoneVisiting }; unsigned id; TimeStamp stamp; Node *cyclicAncestor; std::vector dests; StatusType status; Node(unsigned id) { this->id = id; cyclicAncestor = NULL; status = NotVisited; } ~Node() {} }; class CycleDetector { public: CycleDetector(unsigned numVertices, Edges *edges); ~CycleDetector(); std::vector *detect_cycles(); void mod_graph(unsigned numVertices, Edges *edges); unsigned getV() { return this->V; } Edges *getEdges() { return this->edges; } private: // attributes unsigned V; Edges *edges; // internally used variables. std::vector *nodes; // the nodes in the graph std::vector *cyclicEdgesMapping; // the cyclic edges in the graph. std::vector traverse; // nodes still left to visit in the graph std::stack seenInRun; // nodes visited in a single pass. // internally used methods void make_matrix(); void visit(unsigned k); bool isSink(Node *node); bool find_node(std::vector *& list, unsigned k); std::pair< bool, std::vector::iterator > find_node(std::vector& list, unsigned k); }; #endif