Dijkstra算法
void dijkstra()
{
int s=1;
int dis[NUM];
bool done[NUM];
for(int i=1;i<=n;i++)
{dis[i]=INF;done[i]=false;}
dis[s]=0;
priority_queue<node> q;
q.push(node(s,dis[s]));
while(!q.empty())
{
node u=q.top();
q.pop();
if(done[u.id]) continue;
done[u.id]=1;
for(int i=0;i<e[u.id].size();i++)
{
edge y=e[u.id][i];
if(done[y.to]) continue;
if(dis[y.to]>y.w+u.dis)
{
q.push(node(y.to,dis[y.to]));
pre[y.to]=u.id;
}
}
}
}
算法主体部分大致如上,我们需要知道的事,该算法是贪心+DFS,BFS的内容非常容易理解,将遍历的节点进队,然后遍历其邻节点,若出现起始节点经该节点转折到其邻节点更短,则将其邻节点进队。贪心则是对BFS的优化,我们需要避免重复的节点运算,所以,我们可以将遍历过的节点标记。当出现两条路径到相同节点时,我们永远选择较短的那一条,遍历完成后,较长的那一条路径因为后续节点已经被遍历过了,所以可以直接避免运算。

浙公网安备 33010602011771号