码迷,mamicode.com
首页 > 其他好文 > 详细

dijkstra优先队列优化(代码抄袭。。。)

时间:2015-08-21 08:15:36      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

1.建立一个结构体以存放邻接表:struct edge(int to,dist; edge*next)

2.每一次读入一组数据,每个节点都有一个链表,里面保存着从该节点出发的所有边:

void add( int u , int v , int d ) {
   pt -> to = v;
   pt -> dist = d;
   pt -> next = head[ u ];    //head存放第一条边,且同一个起点的各条边在邻接表中的书序和读入顺序正好相反;            
   head[ u ] = pt++;          //这里pt++是申请内存吧;
}                                     //同时注意无向图每条边会在邻接表中出现两次;
 
3.重磅戏,优先队列然后加个什么什么函数(记住就好了吧==):
 
struct node {
  int x , d;                                                     //x是编号,d是距离起点的距离,加一个d[]数组很明显避免了对链表的遍历;
  bool operator < ( const node &rhs ) const {
  return d > rhs.d;
  }
};
 
int d[ maxn ];
priority_queue< node > Q;
 
4.然后很简单啦,明白dijkstra原理就不难写出来了:
   
void dijkstra( int S ) {
    clr( d , inf );
    d[ S ] = 0;
    Q.push( ( node ) { S , 0 } );
    while( ! Q.empty() ) {
        node o = Q.top();
        Q.pop();
        int x = o.x , dist = o.d;
        if( dist != d[ x ] ) continue;
        for( edge* e = head[ x ] ; e ; e = e -> next ) {
               int to = e -> to;
               if( d[ to ] > dist + e -> dist ) {
                    d[ to ] = dist + e -> dist;
                    Q.push( ( node ) { to , d[ to ] } );
               }
      }
   }
}
 
完了。。。大概只有我这种低智商的才需要慢慢分析吧==加油
 
 
 
 
 
 
 
 
 
 

dijkstra优先队列优化(代码抄袭。。。)

标签:

原文地址:http://www.cnblogs.com/20003238wzc--/p/4746764.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!