#ifndef __FPA__BASE__DIJKSTRA__HXX__ #define __FPA__BASE__DIJKSTRA__HXX__ #include // ------------------------------------------------------------------------- template< class V, class C, class R, class VC, class B > fpa::Base::Dijkstra< V, C, R, VC, B >:: Dijkstra( ) : Superclass( ) { } // ------------------------------------------------------------------------- template< class V, class C, class R, class VC, class B > fpa::Base::Dijkstra< V, C, R, VC, B >:: ~Dijkstra( ) { } // ------------------------------------------------------------------------- template< class V, class C, class R, class VC, class B > bool fpa::Base::Dijkstra< V, C, R, VC, B >:: _ComputeNeighborResult( TResult& result, const TVertex& neighbor, const TVertex& parent ) const { result = this->_Cost( neighbor, parent ); result *= TResult( this->_Distance( neighbor, parent ) ); // WARNING: Dijkstra does not work on negative values! if( result >= TResult( 0 ) ) { _TNode pn = this->_Node( parent ); if( pn.Label == Self::AliveLabel ) result += pn.Result; return( true ); } else return( false ); } // ------------------------------------------------------------------------- template< class V, class C, class R, class VC, class B > bool fpa::Base::Dijkstra< V, C, R, VC, B >:: _IsQueueEmpty( ) const { return( this->m_Queue.empty( ) ); } // ------------------------------------------------------------------------- template< class V, class C, class R, class VC, class B > void fpa::Base::Dijkstra< V, C, R, VC, B >:: _QueuePush( const TVertex& v, const _TNode& n ) { _TQueueNode qn; qn.Vertex = v; qn.Node = n; this->m_Queue.push_back( qn ); std::push_heap( this->m_Queue.begin( ), this->m_Queue.end( ) ); } // ------------------------------------------------------------------------- template< class V, class C, class R, class VC, class B > void fpa::Base::Dijkstra< V, C, R, VC, B >:: _QueuePop( TVertex& v, _TNode& n ) { _TQueueNode qn = this->m_Queue.front( ); std::pop_heap( this->m_Queue.begin( ), this->m_Queue.end( ) ); this->m_Queue.pop_back( ); v = qn.Vertex; n = qn.Node; } // ------------------------------------------------------------------------- template< class V, class C, class R, class VC, class B > void fpa::Base::Dijkstra< V, C, R, VC, B >:: _QueueClear( ) { this->m_Queue.clear( ); } #endif // __FPA__BASE__DIJKSTRA__HXX__ // eof - $RCSfile$