dijkstra优先队列优化

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 ) {               //当全部的节点都遍历完毕后,e==0了;
               int to = e -> to;
               if( d[ to ] > dist + e -> dist ) {
                    d[ to ] = dist + e -> dist;
                    Q.push( ( node ) { to , d[ to ] } );
               }
      }
   }
}
 ps:最重要的地方在优先队列(。。。),因为要排的是距离起点的大小,很明显,如果用存储的像spfa一样只是存储节点是不行的,所以要两个一起上!
完了。。。大概只有我这种低智商的才需要慢慢分析吧==加油
 
 
 
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/20003238wzc--/p/4746764.html

Dijkstra算法是一种用于寻找图中两点之间最短路径的经典算法,通常会利用优先队列(如二叉堆)来优化搜索过程。在C++中,我们可以使用`std::priority_queue`来实现这个数据结构。下面是一个简化版的Dijkstra算法使用优先队列的示例: ```cpp #include <iostream> #include <vector> #include <queue> #include <limits> struct Node { int id; int dist; bool visited; Node(int _id, int _dist) : id(_id), dist(_dist), visited(false) {} bool operator<(const Node& other) const { return dist < other.dist; } }; void dijkstra(std::vector<std::pair<int, int>>& graph, int start) { std::priority_queue<Node> pq; std::vector<int> dist(graph.size(), std::numeric_limits<int>::max()); dist[start] = 0; pq.push(Node(start, 0)); while (!pq.empty()) { Node current = pq.top(); pq.pop(); if (current.visited) continue; current.visited = true; for (auto [neighbor, weight] : graph[current.id]) { int new_dist = current.dist + weight; if (new_dist < dist[neighbor]) { dist[neighbor] = new_dist; pq.push(Node(neighbor, new_dist)); } } } // 打印结果 for (int i = 0; i < graph.size(); ++i) { if (dist[i] != std::numeric_limits<int>::max()) std::cout << "Node " << i << ": Shortest distance from start is " << dist[i] << std::endl; } } // 使用示例 int main() { std::vector<std::pair<int, int>> graph = {{0, 4}, {1, 2}, {2, 7}, {3, 9}, {3, 14}, {4, 10}, {5, 1}, {6, 2}}; dijkstra(graph, 0); return 0; } ``` 在这个例子中,我们首先创建一个`Node`结构体表示图中的每个节点,包含ID、距离值和访问标志。然后,我们使用`std::priority_queue`存储待处理的节点,并按照距离值排序。在每次循环中,我们会选择距离最近未访问过的节点,并更新其相邻节点的距离。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值