做这道题的时候同时复习了 堆优化版本的Dijkstra
#include<cstdio>
#include<queue>
#include<cstring>
#include<utility>
#include<map>
#include<queue>
#include<vector>
using namespace std;
typedef pair<long long,int> par;
int n,m;
int head[30005],nex[150005],to[150005],val[150005],tot=1;
long long dis[30005];
bool vis[150005];
void add(int u,int v,int c)
{
nex[tot]=head[u];
to[tot]=v;
val[tot]=c;
head[u]=tot;
tot++;
}
void dij()
{
memset(dis,0x3f3f3f3f,sizeof(dis));
priority_queue<par,vector<par>,greater<par> > q;//这里必须多打一个空格 否则会被识别为位运算运算符
dis[1]=0;
q.push(make_pair(dis[1],1));
while(!q.empty())
{
par tmp=q.top();
q.pop();
int x=tmp.second;
if(vis[x])
{
continue;
}
vis[x]=true;//在这里标记是否已经访问过
for(int i=head[x];i;i=nex[i])
{
int y=to[i];
if(dis[x]+val[i]<dis[y])
{
dis[y]=dis[x]+val[i];
q.push(make_pair(dis[y],y));
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
dij();
printf("%lld\n",dis[n]);
return 0;
}
本文深入探讨了使用优先队列优化的Dijkstra算法,详细介绍了如何通过堆数据结构提高最短路径查找效率。文章提供了完整的C++实现代码,包括邻接表、优先队列的运用,以及算法的具体步骤。

215

被折叠的 条评论
为什么被折叠?



