Floyd算法

Floyd算法本质上是一种动态规划
先定义两个二维数组D[x][x],P[x][x], D 代表顶点到定点之间最短路径权值和的矩阵,P代表对应顶点最短路径的前驱矩阵。
先将D初始化为图的邻接矩阵。

其实就是中转点的问题。

动归方程:
D[v][w] = min{ D[v][w], D[v][k]+D[k][w]};

typedef int Pathmtirx[maxv][maxv];
typedef int ShrotPathTable[maxv][maxv];]

//求网图G中各顶点v到其余顶点w的最短路径P[v][w]和带权长度D[v][w]

void ShortestPath_Floyd(MGraph G,Pathmatirx *P,ShortPathTable *D)
{
     for(int v = 0; v < G.numVertexes; ++v )
     {
          for( int w = 0; w < G.numVertexes; ++w)
          {
               (*D)[v][w] = G.matirx[v][w];    //D[v][w]值即为对应点间的权值
               (*P)[v][w] = w;                    //初始化P
          }
     }

     for(int k = 0; k < G.numVertexes; ++k)
     {
          for(int  v = 0; v < G.numVertexes; ++v)
          {
                   for(int w = 0; w < G.numVertrexes; ++w)
                   {
                         if((*D)[v][w] > (*D)[v][k] + (*D)[k][w])
                         //如果经过下标为k的顶点的路径比原两点路径短
                         {
                              (*D)[v][w] = (*D)[v][k] + (*D)[k][w];
                              (*P)[v][w] = (*D)[v][k];
                              //路径设置为经过k的顶点
                         }
                   }
          }
     }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值