floyd详解

求单源最短路的算法相信大家都看过了,下面介绍一个各个点之间的最短路算法,它就是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;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值