dijkstra算法堆优化
dijkstra算法:每次选一个点,更新邻点,循环n-1次。
在实现dijkstra算法的过程中,我们需要使用存图结构(邻接表或邻接矩阵),时间复杂度为o(n2),但在数量级较大的题目中显然这是不满足要求,这时就需考虑dijkstra算法的优化。
堆优化:优化dijkstra算法从头至尾的扫描的过程,使用小根堆,利用优先队列来维护查找并更新最小距离的点。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,m;
int next[200005],to[200005],head[200005],edge[200005];
int tot;
int dis[100005];
int INF=0X3f3f3f3f;
//使用邻接表存图
void add(int x,int y,int z)
{
tot++;
to[tot]=y;
edge[tot]=z;
next[tot]=head[x];
head[x]=tot;
}
int main()
{
int s;
scanf("%d%d%d",&n,&m,&s);
int i;
for(i=0;i<m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
fill(dis+1,dis+n+1,INF);
//使用优先队列优化
priority_queue< pair<int,int>,vector< pair<int,int> >,greater<pair<int,int> > > que;
que.push(pair<int,int>(0,s));
dis[s]=0;
while(!que.empty())
{
pair<int,int> t=que.top();
que.pop();
if(t.first>dis[t.second])
continue;
for(i=head[t.second];i;i=next[i])
{
if(edge[i]+dis[t.second]<dis[to[i]])
{
dis[to[i]]=edge[i]+dis[t.second];
que.push(pair<int,int>(dis[to[i]],to[i]));
}
}
}
for(i=1;i<=n;i++)
printf("%d ",dis[i]);
}