您所在的位置:首页 - 百科 - 正文百科

dijkstra算法编程

凛然
凛然 04-27 【百科】 501人已围观

摘要标题:Dijkstra算法详解及实现Dijkstra算法是一种经典的图论算法,用于求解具有非负边权的加权有向图中的最短路径。下面我们来详细介绍一下Dijkstra算法的原理和实现方法。一、算法原理Di

Dijkstra算法详解及实现

Dijkstra算法是一种经典的图论算法,用于求解具有非负边权的加权有向图中的最短路径。下面我们来详细介绍一下Dijkstra算法的原理和实现方法。

一、算法原理

Dijkstra算法的基本思路是采用贪心策略,按照顶点到起点的距离从小到大的顺序进行遍历。对于一个起点s和终点t,我们可以用一个数组dist[i]来记录从起点s到顶点i的最短距离,同时用一个数组path[i]来记录当前计算出的最短路径上顶点i的前驱节点。

具体实现中,我们用一个优先队列(最小堆)来存储当前已知的到起点距离最小的顶点。每次从优先队列中取出当前距离起点最近的顶点u,然后以u为中心,搜索其所有邻接点v,并计算s>u>v的距离,如果这个距离比现有的dist[v]小,则更新dist[v]和path[v]的值,并将v加入优先队列中。

最终,当我们取出的顶点是终点t时,dist[t]所记录的就是起点s到终点t的最短路径长度,而path[t]所记录的就是起点s到终点t的最短路径。

二、算法实现

下面我们来看一下Dijkstra算法的具体实现。每次取出距离起点最近的顶点时,我们可以使用STL中提供的优先队列(也称为堆),其底层实现是最小堆。优先队列的元素类型应该是pair,第一个元素表示距离起点的距离,第二个元素表示顶点的编号。

代码如下:

```c

include

include

include

using namespace std;

const int MAXN = 1e5 5; // 最大顶点数

const int INF = 0x3f3f3f3f; // 表示正无穷大

int n, m; // 顶点数和边数

int dist[MAXN]; // 距离数组,表示从起点到各个顶点的距离

int path[MAXN]; // 路径数组,存储最短路径的前驱节点

bool vis[MAXN]; // 访问标记数组,表示当前节点是否已经被访问过

vector> adj[MAXN]; // 邻接表,保存图的边信息

void dijkstra(int s) {

priority_queue, vector>, greater>> pq;

// 优先队列,存储pair类型数据,默认最小堆(根据第一个元素排序),第二个元素存储顶点编号

pq.push(make_pair(0, s)); // 初始状态下,起点距离为0

dist[s] = 0;

while (!pq.empty()) {

auto cur = pq.top(); pq.pop();

int u = cur.second;

if (vis[u]) continue;

vis[u] = true;

for (auto& edge : adj[u]) {

int v = edge.first, w = edge.second;

if (vis[v]) continue;

if (dist[v] > dist[u] w) {

dist[v] = dist[u] w;

path[v] = u;

pq.push(make_pair(dist[v], v));

}

}

}

}

int main() {

cin >> n >> m;

// 初始化邻接表

for (int i = 0; i < m; i) {

int u, v, w;

cin >> u >> v >> w;

adj

Tags: 浪漫情缘婚恋网 斗鱼mini 官宣是什么意思 换装小游戏 奥特曼封魔传

最近发表

icp沪ICP备2023033053号-25
取消
微信二维码
支付宝二维码

目录[+]