BZOJ1598 K短路 Astar裸题

来源:互联网 发布:怎么禁止软件启动 编辑:程序博客网 时间:2024/05/20 04:29

大家都很强, 可与之共勉 。

手写堆2333

# include <cstdio># include <cstring># include <utility># include <algorithm># include <functional>template < class T >  inline bool chkmin ( T& d, const T& x )  {  return ( d > x ) ? ( d = x ), 1 : 0 ;  }# define N 100010# define M 100010template < class T >class Heap  {    private :        int len ;        T a [M << 1] ;    public :        Heap ( )  {   len = 0 ;  }        inline void push ( const T& ele )  {            a [++ len] = ele ;            std :: push_heap ( a + 1, a + 1 + len, std :: greater < T > ( ) ) ;        }        inline void clear ( )  {            len = 0 ;        }        inline T& top ( )  {            return a [1] ;        }        inline void pop ( )  {            std :: pop_heap ( a + 1, a + 1 + len, std :: greater < T > ( ) ) ;            -- len ;        }        inline bool empty ( )  {            return len == 0 ;        }} ;struct edge  {    int to, w ;  edge* nxt ;    edge ( )  {   }    edge ( int to, int w, edge* nxt ) : to ( to ), w ( w ), nxt ( nxt )  {   }} ;class Graph  {    private :        edge g [M << 1], *head [N] ;    public :        Graph ( )  {  memset ( head, 0, sizeof head ) ;  }        inline void add_edge ( int u, int v, int w )  {            static edge* cur ( g ) ;            *cur = edge ( v, w, head [u] ) ; head [u] = cur ++ ;        }        inline edge*& operator [] ( const int& u )  {  return head [u] ;  }} G, Rev ;Heap < std :: pair < int, int > > Q ;int ans [N] ;int dis [N] ;# undef N# undef Mint n, m, k ;void Dijkstra ( int s )  {    memset ( dis, 0x3f, sizeof ( int ) * ( n + 1 ) ) ;    Q.clear ( ) ;    dis [s] = 0 ;    Q.push ( std :: make_pair ( 0, s ) ) ;    while ( ! Q.empty ( ) )  {        int u = Q.top ( ).second ; Q.pop ( ) ;        for ( edge* it = Rev [u] ; it ; it = it -> nxt )  {            int& v = it -> to ;            if  ( chkmin ( dis [v], dis [u] + it -> w ) )  {                Q.push ( std :: make_pair ( dis [v], v ) ) ;            }        }    }}void Astar ( int s, int t )  {    if ( dis [s] == 0x3f3f3f3f )  return ;    Q.clear ( ) ;    int cnt ( 0 ) ;    Q.push ( std :: make_pair ( dis [s], s ) ) ;    while ( ! Q.empty ( ) )  {        int u = Q.top ( ).second, d = Q.top ( ).first ;        Q.pop ( ) ;        if ( u == t )  ans [++ cnt] = d ;        if ( cnt == k )  return ;        for ( edge* it = G [u] ; it ; it = it -> nxt )  {            Q.push ( std :: make_pair ( d - dis [u] + it -> w + dis [it -> to], it -> to ) ) ;        }    }}int main ( )  {    scanf ( "%d%d%d", & n, & m, & k ) ;    while ( m -- )  {        int u, v, w ;        scanf ( "%d%d%d", & u, & v, & w ) ;        Rev.add_edge ( v, u, w ) ;        G.add_edge ( u, v, w ) ;    }    Dijkstra ( 1 ) ;    memset ( ans, -1, sizeof ( int ) * ( k + 1 ) ) ;    Astar ( n, 1 ) ;    for ( int i = 1 ; i <= k ; ++ i )  {        printf ( "%d\n", ans [i] ) ;    }}