Dijkstra算法简介

文章目录

简单介绍

Dijkstra算法是单源最短路算法,采用贪心思想。
假设图有n个顶点,从源点1出发,计算其他各个顶点距离源点1的最短路径。使用dis数组存储各个点距离源点1的距离,初始化dis[1]为0,其他为 + ∞ +\infty +。算法步骤如下:

Created with Raphaël 2.2.0 开始 选择离源点最近的点 (dis数组中值最小) 扩展该点(打标记) 松弛从该点出发的边 (更新dis数组) 所有点都 扩展完成? 结束 yes no

该算法需要保证已经扩展的点,在后续边松弛过程中距离不会被更新,所以图中不能有负权边。
如果存在负权边,通过负权边访问扩展过的点,会导致该点的距离被更新。如图:
在这里插入图片描述

代码

附上堆优化的dijkstra代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue> 
#define E 200010
#define V 100010 
using namespace std;

struct edge
{
    int to,w;
};
/*v表示顶点,d表示距离*/ 
struct path
{	
    int v, d;
    bool operator < (const path &p) const
    {
        return d>p.d;
    }
};

priority_queue<path> pque;
 
vector<edge> G[V];//下标表示顶点,值表示从该顶点出发的边的数组。 
int n,m,s;
int dis[V],book[V];
const int INF=2147483647;

void dijkstra()
{
    int minn,u;
    path p={s,dis[s]};
    pque.push(p);
    while(!pque.empty())
    {
        path tmp=pque.top();pque.pop();
        if (book[tmp.v]) continue;
        book[tmp.v]=1;
        for (int i=0;i<G[tmp.v].size();i++)
        {
            if (dis[G[tmp.v][i].to]>dis[tmp.v]+G[tmp.v][i].w)
            {
                dis[G[tmp.v][i].to]=dis[tmp.v]+G[tmp.v][i].w;
                pque.push({G[tmp.v][i].to,dis[G[tmp.v][i].to]});
            }				
        } 
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值