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

来源:互联网 发布:js弹出路径选择对话框 编辑:程序博客网 时间:2024/06/17 14:47

【Bellman-Ford算法】

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

结构:

#define MAX_V 10000#define MAX_E 50000int 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。

原创粉丝点击