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的优化,我们需要避免重复的节点运算,所以,我们可以将遍历过的节点标记。当出现两条路径到相同节点时,我们永远选择较短的那一条,遍历完成后,较长的那一条路径因为后续节点已经被遍历过了,所以可以直接避免运算。

posted @ 2025-03-02 12:39  _窗帘  阅读(17)  评论(0)    收藏  举报