void Kruskal(){ int origen , destino , peso; int total = 0; //Peso total del MST int numAristas = 0; //Numero de Aristas del MST MakeSet( V ); //Inicializamos cada componente std::sort( arista , arista + E ); //Ordenamos las aristas por su comparador for( int i = 0 ; i < E ; ++i ){ //Recorremos las aristas ya ordenadas por peso origen = arista[ i ].origen; //Vértice origen de la arista actual destino = arista[ i ].destino; //Vértice destino de la arista actual peso = arista[ i ].peso; //Peso de la arista actual //Verificamos si estan o no en la misma componente conexa if( !sameComponent( origen , destino ) ){ //Evito ciclos total += peso; //Incremento el peso total del MST MST[ numAristas++ ] = arista[ i ]; //Agrego al MST la arista actual Union( origen , destino ); //Union de ambas componentes en una sola } } //Si el MST encontrado no posee todos los vértices mostramos mensaje de error //Para saber si contiene o no todos los vértices basta con que el numero //de aristas sea igual al numero de vertices - 1 if( V - 1 != numAristas ){ puts("No existe MST valido para el grafo ingresado, el grafo debe ser conexo."); return; } puts( "-----El MST encontrado contiene las siguientes aristas-----"); for( int i = 0 ; i < numAristas ; ++i ) printf("( %d , %d ) : %d\n" , MST[ i ].origen , MST[ i ].destino , MST[ i ].peso ); //( vertice u , vertice v ) : peso printf( "El costo minimo de todas las aristas del MST es : %d\n" , total ); }
void HCComponent::addClauseToChecker( Clause* c, Var headAtom ) { assert( c != NULL ); trace_msg( modelchecker, 2, "Adding clause " << *c ); Clause& orig = *c; Clause* clause = new Clause( c->size() ); for( unsigned int i = 0; i < orig.size(); i++ ) { clause->addLiteral( orig[ i ] ); Var v = orig[ i ].getVariable(); if( !sameComponent( v ) ) { Var newVar = getCheckerVarFromExternalLiteral( orig[ i ] ); if( newVar != v ) { orig[ i ].setVariable( newVar ); orig[ i ].setPositive(); } } else { if( orig[ i ].isNegativeBodyLiteral() ) { Var newVar = getCheckerVarFromExternalLiteral( orig[ i ] ); if( newVar != v ) { orig[ i ].setVariable( newVar ); orig[ i ].setPositive(); } } } } getGUSData( headAtom ).definingRulesForNonHCFAtom.push_back( clause ); checker.addClause( c ); }