求单源最短路的算法相信大家都看过了,下面介绍一个各个点之间的最短路算法,它就是floyd算法,这个算法很好记忆,简单的一个三重循环。
我觉得floyd算法其实就用了一个原理:
对于图G(v,e)来说,图中从某个点到另外一个点的最短路其间顶多经过|v|个结点,而floyd算法正是将图的所有结点都加进来作为结点i->j的跳板,从而对图的每对结点进行至多|v|次松弛操作.
由于算法写起来比较简单,这里直接贴下代码:
#include <iostream>
#define MAX 30
#define INF 9999
using 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;
}