优先级队列+邻接矩阵+Dijkstra算法 发表于 2018-12-11 | Edited on 2023-03-05 | 分类于 算法设计与分析 | 次阅读 优先级队列+邻接矩阵+Dijkstra算法 DijkStra算法代码 Copy1234567891011121314151617181920212223242526272829303132333435// 定义Edge表示每一条边,from是始点,to是汇点,distance表示距离struct Edge { int from, to, distance; Edge(int f, int t, int d) :from(f), to(t), distance(d) {}; bool operator <(const Edge& e)const { return this->distance > e.distance; };};// graph 表示图,以邻接矩阵形式表示,其中0编号顶点不算在图中。// source表示源点// distance表示从source到其他顶点的距离数组// visit[i]表示顶点i是否在源点所在的集合中void dijkstra(const vector<vector<int>>& graph, const int source, vector<int>& distance) { vector<int> visit(graph.size(), 0); priority_queue<Edge> myQueue; visit[0] = 1; visit[source] = 1; // 初始时往优先级队列中加入从源点发出的所有的边 for (int i = 1; i < graph.size(); ++i) if(visit[i]==0) myQueue.emplace(source, i, distance[i]); while (!myQueue.empty()) { Edge e = myQueue.top(); myQueue.pop(); if (visit[e.to] == 1) continue; visit[e.to] = 1; distance[e.to] = e.distance; for (int j = 1; j < graph.size(); ++j) { if (visit[j] == 0 && distance[e.to] + graph[e.to][j] < distance[j]){ myQueue.emplace(e.to, j, distance[e.to] + graph[e.to][j]); } } }} 复杂度分析 最多每条边都进入优先级队列,每次进入后队列调整用时logm,所以复杂度为O(mlogn)