floyd详解

来源:互联网 发布:华为网络技术学院 编辑:程序博客网 时间:2024/05/20 14:16

求单源最短路的算法相信大家都看过了,下面介绍一个各个点之间的最短路算法,它就是floyd算法,这个算法很好记忆,简单的一个三重循环。

我觉得floyd算法其实就用了一个原理:

对于图G(v,e)来说,图中从某个点到另外一个点的最短路其间顶多经过|v|个结点,而floyd算法正是将图的所有结点都加进来作为结点i->j的跳板,从而对图的每对结点进行至多|v|次松弛操作.

由于算法写起来比较简单,这里直接贴下代码:

#include <iostream>#define MAX 30#define INF 9999using namespace std;typedef struct Graph{    int vexnum;    int vecnum;    int map[MAX][MAX];} Graph;void floyd(Graph G){    int i,j,k;    for(k=1; k<=G.vexnum; k++)        for(i=1; i<=G.vexnum; i++)            for(j=1; j<=G.vexnum; j++)            {                if(G.map[i][k]!=INF&&G.map[k][j]!=INF)//减少不必要加法操作                {                    if((G.map[i][k]+G.map[k][j])<G.map[i][j])                        G.map[i][j] = G.map[i][k]+G.map[k][j];                }            }    cout<<"各个顶点间的最短距离分别为:"<<endl;    for(i=1; i<=G.vexnum; i++)        for(j=1; j<=G.vexnum; j++)            cout<<i<<" "<<j<<" "<<dist[i][j]<<endl;}