Exemple #1
0
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
}
Exemple #4
0
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());
}