64,645
社区成员
发帖
与我相关
我的任务
分享
/* dijkstra - optimize */
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#define N 100
//#define LOCAL
using std::vector; using std::priority_queue; using std::greater;
struct Edge
{
int _node;
int _weight;
Edge() : _node( 0 ) , _weight( 0 )
{}
Edge( int node , int weight ) : _node( node ) , _weight( weight )
{}
};
typedef vector< Edge > EdgeList;
EdgeList adj_list[ N + 5 ];
int d[ N + 5 ];
bool flag[ N + 5 ];
struct Node
{
int _node;
int _dist;
Node() : _node( 0 ) , _dist( 0 )
{}
Node( int node , int dist ) : _node( node) , _dist( dist )
{}
bool operator>( const Node& node ) const
{
return this->_node > node._node;
}
};
priority_queue< Node , vector< Node > , greater< Node > > q;
int dijk( EdgeList* adj_list , int n , int s , int t );
void relax( int u , int v , int w );
int main( void )
{
#ifdef LOCAL
freopen( "input.dat" , "r" , stdin );
#endif
int n = 0 , m = 0;
while( scanf( "%d%d" , &n , &m ) , !(0==n&&0==m) )
{
// clear
for( int i = 1 ; i <= n ; ++i )
{
adj_list[ i ].clear();
}
// input
for( int i = 0 ; i < m ; ++i )
{
int u ,v , w;
scanf( "%d%d%d" , &u , &v , &w );
adj_list[ u ].push_back( Edge( v , w ) );
adj_list[ v ].push_back( Edge( u , w ) );
}
// compute
int ans = dijk( adj_list , n , 1 , n );
// output
printf( "%d\n" , ans );
}
return 0;
}
int dijk( EdgeList* adj_list , int n , int s , int t )
{
// init
memset( d , 0x3f , sizeof( d ) );
d[ s ] = 0;
// s v-s
memset( flag , 0 , sizeof( flag ) );
int cnt = n;
// clear the q
while( !q.empty() )
q.pop();
q.push( Node( s , d[s] ) );
while( cnt > 0 )
{
// select u
int u = q.top()._node;
q.pop();
if( true == flag[ u ] )
continue;
// add u to s
flag[ u ] = true;
if( u == t )
break;
// relax ( u , v , w )
int size = adj_list[ u ].size();
for( int i = 0 ; i < size ; ++i )
{
int v = adj_list[ u ][ i ]._node;
int w = adj_list[ u ][ i ]._weight;
relax( u , v , w );
}
--cnt;
}
return d[ t ];
}
void relax( int u , int v , int w )
{
if( d[ u ] + w < d[ v ] )
{
d[ v ] = d[ u ] + w;
q.push( Node( v , d[ v ] ) );
}
}