status topological_sort( graph G, int vertex_cnt, status ( *p_func_f )()) { edge *p_edge = NULL ; int i, index, sum, *local_par ; i = 0 ; local_par = ( int* )malloc( sizeof( int ) * ( G -> number_of_vertices )) ; sum = vertex_cnt ; for( i = 0 ; i < vertex_cnt ; i++ ) local_par[i] = 0 ; for( i = 0 ; i < vertex_cnt ; i++ ) while(( p_edge = edge_iterator( G, i, p_edge )) != NULL ) local_par[VERTEX( p_edge )]++ ; while( sum > 0 ) { for( i = 0 ; ( vertex )i < vertex_cnt ; i++ ) if( local_par[i] == 0 ) index = i ; p_edge = NULL ; while(( p_edge = edge_iterator( G, ( vertex )index, p_edge )) != NULL ) local_par[VERTEX(p_edge)]-- ; ( *p_func_f )( index ) ; local_par[index] = -1 ; sum-- ; } return OK; }
ViewVertex::edge_iterator NonTVertex::edges_iterator(ViewEdge *iEdge) { for (edges_container::iterator it = _ViewEdges.begin(), itend = _ViewEdges.end(); it != itend; it++) { if ((it)->first == iEdge) return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), it); } return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.begin()); }
ViewVertex::edge_iterator TVertex::edges_iterator(ViewEdge *iEdge) { for (edge_pointers_container::iterator it = _sortedEdges.begin(), itend = _sortedEdges.end(); it != itend; it++) { if ((*it)->first == iEdge) return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), it); } return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin()); #if 0 directedViewEdge dEdge; if (_FrontEdgeA.first == iEdge) dEdge = _FrontEdgeA; else if (_FrontEdgeB.first == iEdge) dEdge = _FrontEdgeB; else if (_BackEdgeA.first == iEdge) dEdge = _BackEdgeA; else if (_BackEdgeB.first == iEdge) dEdge = _BackEdgeB; return edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB, dEdge); #endif }
status depth_first_search( graph G, vertex vertex_number, bool visited[], status (*p_func_f)()){ edge *p_edge = NULL ; status rc ; visited[vertex_number] = TRUE; if(( *p_func_f )( vertex_number ) == ERROR ) return ERROR; while(( p_edge = edge_iterator( G, vertex_number, p_edge )) != NULL ) if( visited[VERTEX( p_edge )] == FALSE ) { rc = depth_first_search( G, VERTEX( p_edge ), visited, p_func_f ) ; if( rc == ERROR ) return ERROR; } return OK ; }
//! view edge iterator ViewEdge::edge_iterator ViewEdge::ViewEdge_iterator() { return edge_iterator(this); }
ViewVertex::edge_iterator NonTVertex::edges_end() { return edge_iterator(_ViewEdges.begin(), _ViewEdges.end(), _ViewEdges.end()); }
ViewVertex::edge_iterator TVertex::edges_end() { //return edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB, directedViewEdge(0,true)); return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.end()); }
/*! iterators access */ ViewVertex::edge_iterator TVertex::edges_begin() { //return edge_iterator(_FrontEdgeA, _FrontEdgeB, _BackEdgeA, _BackEdgeB, _FrontEdgeA); return edge_iterator(_sortedEdges.begin(), _sortedEdges.end(), _sortedEdges.begin()); }