35 int find_n( std::vector < Node * > & __depthFirstSearchNodes,
Node *__n)
37 for (
unsigned i=0; i<__depthFirstSearchNodes.size(); i++)
38 if (__depthFirstSearchNodes[i] == __n)
43 int find_n( std::vector < Arc * > & __depthFirstSearchArcs,
Arc *__a)
45 for (
unsigned i=0; i<__depthFirstSearchArcs.size(); i++)
46 if (__depthFirstSearchArcs[i] == __a)
60 for (
unsigned i = 0; i < cycles.size(); i++)
62 for (
unsigned j=0; j<cycles[i].size(); j++)
64 std::vector < Node * >::const_iterator it = std::find(cycle.begin(), cycle.end(), cycles[i][j]);
65 if (it == cycle.end())
66 goto not_equal_cycles;
68 if (cycles[i].size() == cycle.size())
71 std::cout <<
"Cycle \"";
72 for (
int j=0; j<cycle.size(); j++)
73 std::cout << cycle[j]->Id() <<
", ";
74 std::cout <<
"\" matches cycle ";
75 for (
int j=0; j<cycles[i].size(); j++)
76 std::cout << cycles[i][j]->Id() <<
", ";
77 std::cout << std::endl;
80 else if (cycles[i].size() > cycle.size())
83 std::cout <<
"the candidate cycle \"";
84 for (
int j=0; j<cycle.size(); j++)
85 std::cout << cycle[j]->Id() <<
", ";
86 std::cout <<
"\" is shorter than the cycle \"";
87 for (
int j=0; j<cycles[i].size(); j++)
88 std::cout << cycles[i][j]->Id() <<
", ";
90 std::cout << std::endl;
97 std::cout <<
"the candidate cycle \"";
98 for (
int j=0; j<cycle.size(); j++)
99 std::cout << cycle[j]->Id() <<
", ";
100 std::cout <<
"\" is longer than the cycle \"";
101 for (
int j=0; j<cycles[i].size(); j++)
102 std::cout << cycles[i][j]->Id() <<
", ";
104 std::cout << std::endl;
112 std::cout <<
"Cycle \"";
113 for (
int j=0; j<cycle.size(); j++)
114 std::cout << cycle[j]->Id() <<
", ";
115 std::cout <<
"\" is a new cycle "<< std::endl;
122 dfsCycle(
Node *__n, std::vector < Node * > & __depthFirstSearchNodes, std::vector< Arc * > & __depthFirstSearchArcs, std::vector < std::vector < Node * > > & cycles )
124 std::set < Node * > adj;
126 std::vector<Node*>::iterator it3;
129 if (__depthFirstSearchNodes.size() == 0)
130 __depthFirstSearchNodes.push_back(__n);
132 for ( Node::MultimapArcsById::iterator itIncidentArcs = __n->
IncidentArcs().begin();
136 Arc * incidentArc = itIncidentArcs->second;
137 for ( Arc::MultimapNodesById::iterator itAdjNodes = incidentArc->
Nodes().begin();
138 itAdjNodes != incidentArc->
Nodes().end();
141 Node * adjNode = itAdjNodes->second;
142 std::vector < Node * > tempPath = __depthFirstSearchNodes;
143 std::vector < Arc * > tempPathArcs = __depthFirstSearchArcs;
152 if (is_cycle_exists == -2)
153 cycles.push_back(tempPath);
155 if (is_cycle_exists > 0)
157 cycles [is_cycle_exists] = tempPath;
161 else if (
find_n(__depthFirstSearchNodes, adjNode) == -1 &&
find_n(__depthFirstSearchArcs, incidentArc) == -1)
163 tempPath.push_back(adjNode);
164 tempPathArcs.push_back(incidentArc);
165 dfsCycle (adjNode, tempPath, tempPathArcs, cycles);
175 std::vector < Node * > depthFirstSearchNodes;
176 std::vector < Arc * > depthFirstSearchArcs;
180 depthFirstSearchNodes.clear();
181 dfsCycle (startNode->second, depthFirstSearchNodes, depthFirstSearchArcs, cycles);