#ifndef CYCLE_DETECTOR_H #define CYCLE_DETECTOR_H #include #include #include #include "cola.h" typedef unsigned TimeStamp; typedef std::vector Edges; typedef std::vector CyclicEdges; class 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::map nodes; // the nodes in the graph std::map cyclicEdges; // the cyclic edges in the graph. std::map 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); }; class Node { public: enum StatusType { NotVisited, BeingVisited, DoneVisiting }; unsigned id; TimeStamp stamp; Node *cyclicAncestor; vector dests; StatusType status; Node(unsigned id) { this->id = id; cyclicAncestor = NULL; status = NotVisited; } ~Node() {} }; #endif