Dijkstra
单源最短路,Dijkstra是基于贪心的思想,首先用dis[]记录源点到每个点的最短路径,再用一个数组保存已找到的最短路径的点,然后从dis中找最小值,该值则是源点到该值对应顶点的最短路径,并标记该店为已找到的最短路,选择最小值时,可以用线段树、平衡树、堆来进行优化,适用于无负权的图,时间复杂度O(N*log2(N))。
inline void dijkstra(int s){
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
memset(vis,0,sizeof(vis));
memset(dis,0x3f,sizeof(dis));/*初始化正无穷*/
q.push({0,s});
dis[s]=0;
while(!q.empty()){
int x=q.top().second;
q.pop();
if(vis[x])continue;/*标记过则不用访问*/
vis[x]=1;/*标记*/
for(int i=h[x];i;i=e[i].next){
int y=e[i].to;
if(dis[y]>dis[x]+e[i].w){/*松弛*/
dis[y]=dis[x]+e[i].w;
q.push({dis[y],y});/*直接入队,无需判断*/
}
}
}
}