floyd算法(求任意两点间的最短路径)
2014-01-13 18:18
567 查看
floyd算法用于求任意两点间的最短路径,时间复杂度为O(n^3)。
通过多次调用 Digkstar 算法同样能解决这个问题,时间复杂度同样为O(n^3),但floyd更简洁,利于编程。
floyd算法的思想:
floyd是用一个n*m的邻接表map[ n ][ m ]来存图,通过对map的处理使得矩阵map[ i ][ j ]存的是点i到点j的最短距离。这是算法是通过考虑最佳子路径来寻找最短路的。
具体思想是:能否在点a,b之间加入一块跳板(即加入另外的点)使得a到b的距离缩短,如果可以的话更新a到b的距离,直到所有的点对都更新完。
实现:
for(k = 0; k < n; k++)
for( i = 0; i < n; i++)
for( j = 0; j < n; j++)
if(map[ i ][ k ] + map[ k ][ j ] < map[ i ][ j ])
map[ i ][ j ] = [b]map[i][k] + map[ k ][ j ];[/b]
floyd可以通过记录“跳板”来记录路径:
用矩阵pre[ i ][ j ]来保存走到j的前一个点,初始化的时候保存的都是起点(即i)。
实现:
while( map[ i ][ j ].pre!=i )
{
cout<<pre[ i ][ j ];
k = pre[ i ][ j ];
}
用floyd求最短距离并输出路径的具体代码
通过多次调用 Digkstar 算法同样能解决这个问题,时间复杂度同样为O(n^3),但floyd更简洁,利于编程。
floyd算法的思想:
floyd是用一个n*m的邻接表map[ n ][ m ]来存图,通过对map的处理使得矩阵map[ i ][ j ]存的是点i到点j的最短距离。这是算法是通过考虑最佳子路径来寻找最短路的。
具体思想是:能否在点a,b之间加入一块跳板(即加入另外的点)使得a到b的距离缩短,如果可以的话更新a到b的距离,直到所有的点对都更新完。
实现:
for(k = 0; k < n; k++)
for( i = 0; i < n; i++)
for( j = 0; j < n; j++)
if(map[ i ][ k ] + map[ k ][ j ] < map[ i ][ j ])
map[ i ][ j ] = [b]map[i][k] + map[ k ][ j ];[/b]
floyd可以通过记录“跳板”来记录路径:
用矩阵pre[ i ][ j ]来保存走到j的前一个点,初始化的时候保存的都是起点(即i)。
实现:
while( map[ i ][ j ].pre!=i )
{
cout<<pre[ i ][ j ];
k = pre[ i ][ j ];
}
用floyd求最短距离并输出路径的具体代码
#include <iostream> using namespace std; const int INF = 99999999; int n,m;//n:顶点数,m:边数 struct node { int space; int pre; }map[110][110];//建图,map[i][j].space表示点i到点j的最短距离,map[i][j].pre表示点i到点j的"跳板" void input() { int i,j; for(i = 0; i < n; i++) for(j = 0; j < n; j++) { if(i==j) map[i][j].space = 0; else map[i][j].space = INF; map[i][j].pre = i; }//初始化 int a,b,x; for(i = 0; i < m; i++) { cin>>a>>b>>x; map[a][b].space = x; }//存图 } void floyd()//floyd算法 { int k,i,j; for(k = 0; k < n; k++) for(i = 0; i < n; i++) for(j = 0; j < n; j++) { if(map[i][k].space!=INF && map[k][j].space!=INF && map[i][k].space + map[k][j].space < map[i][j].space) { map[i][j].space = map[i][k].space + map[k][j].space; map[i][j].pre = k; } } } void output() { int i,j; for(i = 0; i < n; i++) for(j = 0; j < n; j++) { cout<<i<<"~"<<j<<"的最短距离:"<<map[i][j].space<<endl; int k = j; cout<<"路径:"<<i<<" "; while(map[i][k].pre!=i) { cout<<map[i][k].pre<<" "; k = map[i][k].pre; } cout<<j<<" \n"; } } int main() { while(1) { cin>>n>>m; if(n+m==0)break; input(); floyd(); output(); } return 0; }
相关文章推荐
- POJ 2139-- 最短路径 (floyd算法,任意两点间的最短路径)
- Dijkstra [迪杰斯特拉]算法思路(求单点到其他每个点的各个最短路径)Floyd算法:任意两点间最短距离
- 运用Floyd算法求得带权有向图任意两点间的最短路径C/C++
- Floyd算法(任意两点间的最短路径)
- warshall-floyd算法:POJ No 2139 Six Degress of Cowvin Bacon(任意两点最短路径))
- Matalab代码 实现 Dijkstra求 有向图及无向图之间,任意两点之间的最短路径
- 根据图的内容能够求出a,b,c,d,e任意两点间的最长路径和最短路径
- 图论02——任意两点间最短距离及路径
- floyed任意两点间最短路径
- 任意两点间最短路径算法实现
- Floyd---任意两点最短路径
- 图论03——改进的任意两点间最短距离及路径
- acm题目及我的程序(2)——Knight Moves (骑士跳跃) ——任意两点间的最短路径所有信息(算法1)
- 任意两点间最短路径算法实现
- 基于pgrouting求任意两点的最短路径的函数pgr_fromAtoB
- acm题目及我的程序(2)——Knight Moves (骑士跳跃) ——任意两点间的最短路径所有信息(算法2)
- 最短路径 (单源最短路径Dijkstra和任意两点最短路径Floyd) C实现
- AOJ GRL_1_C: All Pairs Shortest Path (Floyd-Warshall算法求任意两点间的最短路径)(Bellman-Ford算法判断负圈)
- 【算法】单源最短路径和任意两点最短路径总结(补增:SPFA)
- 任意两点间的最短路径