model_server/gedge/src/bico.cxx
/*-----------------------------------------------------------------------------------------*
 *  BUILD_BICO erzeugt den Baum aus Artikulationspunkten und zweifach zusammenhngenden    *
 *  Komponenten. Vorher mua mit DFS fr jeden Knoten dfnum und low bestimmt worden sein.   *
 *-----------------------------------------------------------------------------------------*/
BUILD_BICO erzeugt den Baum aus Artikulationspunkten und zweifach zusammenhngenden
Komponenten. Vorher mua mit DFS fr jeden Knoten dfnum und low bestimmt worden sein.
BUILD_BICO erzeugt den Baum aus Artikulationspunkten und zweifach zusammenhngenden Komponenten . Vorher mua mit DFS fr jeden Knoten dfnum und low bestimmt worden sein .
void  BUILD_BICO( UNDIR_GRAPH *UG, ARTI_HELP *APinfo, int *used, BICO_COMP *BC, int V )
{
    ARTI_POINT      *AP;
    NODE            *help;
    BICO_COMP       *newBC;
    int             W;
    if ( GET_UNODE_FLAG( UG, V ) ) return;
    SET_UNODE_FLAG( UG, V, true );
    if ( IS_ARTI_POINT( APinfo, V ) ) {
        AP = CREATE_APOINT( V );
        ADD_BICO( AP, BC );
        ADD_APOINT( BC, AP );
    } else
        AP = nil;
    for ( W = GET_FIRST_UNODE( UG, V, &help ); W != 0; W = GET_NEXT_UNODE( &help ) ) {
        if ( ! USED( used, UG->n, V, W ) ) {
            SET_USED( used, UG->n, V, W );
            if ( GET_DFS( APinfo, W ) < GET_DFS( APinfo, V )  ||  
                 GET_LOW( APinfo, W ) < GET_DFS( APinfo, V )  ||
                 AP == nil ) 
            {
                ADD_EDGE( BC, V, W );
                BUILD_BICO( UG, APinfo, used, BC, W );
            } else {                                           
                newBC = CREATE_BICO();
                ADD_APOINT( newBC, AP );
                ADD_BICO( AP, newBC );
                ADD_EDGE( newBC, V, W );
                BUILD_BICO( UG, APinfo, used, newBC, W );
                BUILD_UGRAPH( newBC, UG->n );
            }
        }   
    }   
}
void BUILD_BICO ( UNDIR_GRAPH * UG , ARTI_HELP * APinfo , int * used , BICO_COMP * BC , int V ) { ARTI_POINT * AP ; NODE * help ; BICO_COMP * newBC ; int W ; if ( GET_UNODE_FLAG ( UG , V ) ) return ; SET_UNODE_FLAG ( UG , V , true ) ; if ( IS_ARTI_POINT ( APinfo , V ) ) { AP = CREATE_APOINT ( V ) ; ADD_BICO ( AP , BC ) ; ADD_APOINT ( BC , AP ) ; } else AP = nil ; for ( W = GET_FIRST_UNODE ( UG , V , & help ) ; W != 0 ; W = GET_NEXT_UNODE ( & help ) ) { if ( ! USED ( used , UG -> n , V , W ) ) { SET_USED ( used , UG -> n , V , W ) ; if ( GET_DFS ( APinfo , W ) < GET_DFS ( APinfo , V ) || GET_LOW ( APinfo , W ) < GET_DFS ( APinfo , V ) || AP == nil ) { ADD_EDGE ( BC , V , W ) ; BUILD_BICO ( UG , APinfo , used , BC , W ) ; } else { newBC = CREATE_BICO ( ) ; ADD_APOINT ( newBC , AP ) ; ADD_BICO ( AP , newBC ) ; ADD_EDGE ( newBC , V , W ) ; BUILD_BICO ( UG , APinfo , used , newBC , W ) ; BUILD_UGRAPH ( newBC , UG -> n ) ; } } } }
BUILD_BICO erzeugt den Baum aus Artikulationspunkten und zweifach zusammenhngenden
  Komponenten.
BUILD_BICO erzeugt den Baum aus Artikulationspunkten und zweifach zusammenhngenden Komponenten .
/* V ist Artikulationspunkt */