dijkstra算法堆优化

mz5052 2015-12-11 03:45:45
小弟写了一个dijkstra算法的队优化版本,但是一直过不了。求大神看看,到底是哪的问题?
题目:http://ac.jobdu.com/problem.php?pid=1447
我的代码:

/* 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 ] ) );
}
}
...全文
87 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

64,645

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧