【算法】单源最短路径和任意两点最短路径总结(补增:SPFA)

【Bellman-Ford算法】

    【算法】Bellman-Ford算法(单源最短路径问题)(判断负圈)

结构:

#define MAX_V 10000
#define MAX_E 50000
int V,E;   //顶点和边的数量 
struct edge{
    int from,to,cost;
};
edge es[MAX_E];//边集 
int d[MAX_V];    //d[i]表示从某个点出发到i的最短路径 

 

算法特点:1.每次都用所有的边更新所有的边,直到无可更新为止。

     2.无负圈最多更新 V-1 次,否则有负圈。


 

 

【dijkstra算法】

    【算法】Dijkstra算法(单源最短路径问题)(路径还原) 邻接矩阵和邻接表实现

结构1:

#define MAX_V 10000
#define MAX_E 50000 
int cost[MAX_V][MAX_V];  //cost[u][v]表示e = (u,v)的权值 
int d[MAX_V];        //源点s出发的最短距离 
bool used[MAX_V];    //标记使用过的点 
int V;          //顶点数 

算法特点:1.每次都找没使用过的 d 最小的点,用这个点更新其他点。

     2.不能解决有负圈的图。

结构2:

#define MAX_V 10000
#define MAX_E 50000 
int V;    //顶点数 
int d[MAX_V];            // d[i]表示i离源点的最短距离 
struct edge{  int to,cost;  };     
typedef pair<int, int> P;  //first是最短距离,second是顶点的编号 
vector <edge> G[MAX_V];   // 边集 

算法特点:1.用之前更新过的点,来更新其他点,直到无点可更新。

     2.不能解决有负圈的图。


 

 

【Floyd-Warshall算法】

    【算法】Floyd-Warshall算法(任意两点间的最短路问题)(判断负圈)

结构:

#define MAX_V 10000
#define MAX_E 50000 
int d[MAX_V][MAX_V]; // d[u][v]表示边e=(u,v)的权值(不存在时设为INF,不过d[i][i] = 0) 
int V;             //  顶点数 

算法特点:1.dp[i][j] = min(dp[i][j] , dp[i][k] + d[k][j]);

       基于只有k-1个点的情况,从加入第k个点和不加第k个点中做选择。

     2.能解决有负圈的图,如果d[i][i]出现负数说明有负圈。

 


 

拜读了一位大神的blog学会了SPFA算法:

    【最短路算法】Dijkstra+heap和SPFA的区别

稠密图用Dijkstra,稀疏图用SPFA。

 

posted @ 2017-11-09 01:09  ninding  阅读(320)  评论(0编辑  收藏  举报