总结 最短路径问题

  • DFS
  • BFS
  • Dijkstra
  • Spfa
  • Floyd

 ① DFS:

  • 无权图的最短路(1131 Subway Map)
  • 遍历
  • 合并剪枝使用

② BFS

③ Dijkstra

  • 有权图的最短路
  • 不能处理负边
  • 可以搭配dfs处理复杂的条件(1018Public Bike Management

④ Spfa  万能

  • 有权图最短路
  • 可以处理负边
  • 可以判别负环
 1 void  spfa(s);  //求单源点s到其它各顶点的最短距离
 2     for i=1 to n do { dis[i]=∞; vis[i]=false; }   //初始化每点到s的距离,不在队列
 3     dis[s]=0;  //将dis[源点]设为0
 4     vis[s]=true; //源点s入队列
 5     head=0; tail=1; q[tail]=s; //源点s入队, 头尾指针赋初值
 6     while head<tail do {
 7        head+1;  //队首出队
 8        v=q[head];  //队首结点v
 9        vis[v]=false;  //释放对v的标记,可以重新入队
10        for 每条边(v,i)  //对于与队首v相连的每一条边
11         if (dis[i]>dis[v]+a[v][i])  //如果不满足三角形性质
12          dis[i] = dis[v] + a[v][i]   //松弛dis[i]
13         if (vis[i]=false) {tail+1; q[tail]=i; vis[i]=true;} //不在队列,则加入队列
14     } 
15 
16 //https://blog.csdn.net/xunalove/article/details/70045815

⑤ Floyd

  • 多源最短路

猜你喜欢

转载自www.cnblogs.com/lokwongho/p/10031575.html