DJ 算法的队列优先优化

Posted shuaihui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DJ 算法的队列优先优化相关的知识,希望对你有一定的参考价值。

DJ算法就是求单源最短路的算法,但是时间复杂度不太理想,所以在此献上用最小堆来优化的算法。

如果不懂优先队列可以先去看STL分类关于优先队列的介绍;

技术分享图片
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
#define MAX 21000
#define INF 0x3f3f3f3f
using namespace std;
struct nod
{
    int v;
    int net;
}Eg[2*MAX];
struct noo
{
    int x;
    int s;
    bool operator < (const noo & a) const
    {
        return s<a.s;
    }
}t,temp;
int head[MAX],cnt;
bool book[MAX];
int d[MAX];
void build(int form,int to)
{
    Eg[cnt].v=to;Eg[cnt].net=head[form];head[form]=cnt++;
}
void dj(int s)
{
    priority_queue<noo>q;
    d[s]=0;
    t.x=s;
    t.s=0;
    q.push(t);
    while(!q.empty())
    {
        t=q.top();q.pop();
        if(d[t.x]<t.s)
            continue;
        for(int i=head[t.x];i!=-1;i=Eg[i].net)
        {
            if(d[Eg[i].v]>d[t.x]+1)
            {
                 d[Eg[i].v]=d[t.x]+1;
                 temp.x=Eg[i].v;
                 temp.s=d[Eg[i].v];
                 q.push(temp);
            }

        }
    }

}
int main()
{
    int n,m,u,v;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(head,-1,sizeof(head));
        memset(book,0,sizeof(book));
        memset(d,INF,sizeof(d));
        cnt=0;
        int st=0,en=0;
      for(int i=0 ;i<m ;i++)
       {
        scanf("%d%d",&u,&v);
        build(u,v);
        build(v,u);
       }
       dj(1);
   

    }

}
View Code

该算法实现了1到各个点的最短距离;

以上是关于DJ 算法的队列优先优化的主要内容,如果未能解决你的问题,请参考以下文章

优先队列优化dij算法通用模板

优先队列(堆优化)的dijkstra算法

Dijkstra普通算法及优先队列优化

dijkstra算法模板(优先队列优化)

优先队列优化dij算法

迪杰斯特拉算法_优化版