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); } }
该算法实现了1到各个点的最短距离;
以上是关于DJ 算法的队列优先优化的主要内容,如果未能解决你的问题,请参考以下文章