最短路问题

解决最短路问题有以下算法:Dijkstra算法,Bellman-Ford算法,Floyd算法,和SPFA算法和启发式搜索算法A*;

每个算法都有它的特点可以解决某些特定的问题,例如:Floyd算法可以求解任意两点之间的最短路径长度,SPFA可以判定是否存在负环问题

一. Dijkstra 算法:

  解决的问题:<非负权图单源最短路>1.从某一点出发到所有点的最短路径,就是最后更新的dis数组2.从某一个点到出发到具体某一点的最短路,只要第一次吧这个点加入最短路就可以终止程序了。3.注意Dijkstar 算法不能处理负权边

  思想:贪心

  做法: 每次将未加入最短路径的点种找距离出发点最近的点加入,然后用这个点更新所有没有加入的点到起始点的最小距离,每次加入一个点更新一次,直到所有的点都加入数组后结束,就可以统计出这个点到所有点的最短路径了

  算法复杂度:斐波那契堆的复杂度O(E+VlgV)

  核心代码:

 1 void dijk(int s , int n)
 2 {
 3     int i , j , k ;
 4     for( i = 1 ; i <= n ;i++)
 5     {
 6         p[i] = false;
 7         dist[i] = mp[s][i];
 8     }
 9     p[s] = true;
10     dist[s] = 0;
11     for(i = 1 ; i < n ; i++)
12     {
13         int Min = INF;
14         int k = 0 ;
15         for( j = 1 ; j <= n ;j++)
16         {
17             if(!p[j]&&dist[j]<Min)
18             {
19                 Min = dist[j];
20                 k = j;
21             }
22         }
23         if(Min==INF) return ;
24         p[k] = true;
25         for(j = 1 ; j <= n ;j++)
26         {
27             if(!p[j]&&mp[k][j]!=INF&&dist[j]>dist[k]+mp[k][j])
28                 dist[j] = dist[k]+mp[k][j];
29         }
30     }
31 }
View Code 

相关文章:

  • 2022-01-01
  • 2021-09-23
  • 2021-05-24
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-08
  • 2022-01-09
猜你喜欢
  • 2021-06-15
  • 2021-06-03
  • 2021-06-23
  • 2021-08-28
  • 2021-11-30
  • 2022-12-23
  • 2021-12-09
相关资源
相似解决方案