【最短路问题】
解决最短路问题有以下算法: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 }