前言
dijkstra是一个求最短路的算法,具有代码易写,复杂度优,不容易被卡等优点……
今天写一篇blog来总结一下dijkstra,自己学的第一个最短路算法……
裸的dijkstra
#define inf 0x3fffffff void dijsktra(){ while(1){ int u=-1,minn=inf; for(int i=1;i<=n;i++)if(!vis[i] && dis[i]<minn)minn=dis[i],u=i; if(u==-1)break;vis[u]=1; for(int i=1;i<=n;i++)if(!vis[i] && edge[u][i]!=inf)dis[i]=min(dis[i],dis[u]+edge[u][i]); } }
可以发现 这个算法的瓶颈在于找u这个地方
我们可以用堆来优化
`#include<bits/stdc++.h>
using namespace std;
int n,m,from,to,x,num,head[2505],f[10005],v[25005];
priority_queue<pair<int , int > > q;
//template
struct Edge{int next,to,x;}edge[400005];
inline int add(int from,int to,int x){edge[++num].next=head[from];edge[num].x=x;edge[num].to=to;head[from]=num;}
int main(){
cin>>n>>m;memset(f,0x3f,sizeof(f));
for(int i=1;i<=m;i++){
cin>>from>>to>>x;
add(from,to,x),add(to,from,x);
}
f[1]=0;q.push(make_pair(0,1));
while(!q.empty()){
int x=q.top().second;q.pop();
if(v[x])continue;
v[x]=1;
for(int i=head[x];i;i=edge[i].next){
int y=edge[i].to,z=edge[i].x;
if(f[y]>f[x]+z)f[y]=f[x]+z,q.push(make_pair(-f[y],y));
}
}
printf("%d\n",f[n]);
return 0;
}'
浙公网安备 33010602011771号