Floyd算法

                                     Floyd算法

作者:silence、2012年5月15日

本文参考:Google,数据结构(C语言)
本人声明:个人原创,转载请注明出处。

本文链接:http://blog.csdn.net/perfect2011/article/details/7568375

一 简介

Floyd算法是一种用于寻找图中每一对定点之间最短路径的算法。

二 重点

1,从任意一条单边路径开始。所有两点之间的距离是边的权,或者无穷大,如果两点之间没有边相连。 
2,对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比己知的路径更短。如果是更新它

三 代码实现

#include <cstdlib>
#include <iostream>
/*
Author : silence
Time : 2012/5/15
description : 每一对顶点的最短距离  
*/ 
using namespace std;
struct Graph
{
       int arrArc[20][20];
       int verCount;
       int arcCount;
       };
void floyd(Graph *p,int dis[20][20]){
     
     for(int k = 0;k<p->verCount;k++)
        for(int i = 0;i<p->verCount;i++)
           for(int j = 0;j<p->verCount;j++)
           {
                   //存在更近的路径,则更新 
                   if(dis[i][j]>dis[i][k]+dis[k][j])
                   dis[i][j]=dis[i][k]+dis[k][j];
           }
     
     }

int main(int argc, char *argv[])
{
    Graph g;
    cout<<"input the number of ver and arc"<<endl;
    cin>>g.verCount>>g.arcCount;
    cout<<"input the arc"<<endl;
    //初始化邻接矩阵 
    for(int i = 0;i<g.verCount;i++)
    { for(int j = 0;j<g.verCount;j++)
       {
              //i到本身的距离为0
              //不同节点值为不可达 
              if(i==j) g.arrArc[i][i]= 0;
              else
              g.arrArc[i][j] = 65535;
              }
            } 
    
    int  a,b,distance;
    //无向图 输入各边的权值 
    for(int i=0;i<g.arcCount;i++)
    {
        cin>>a>>b>>distance;
        g.arrArc[a][b]=g.arrArc[b][a]=distance;    
    }
    floyd(&g,g.arrArc);
    cout<<g.arrArc[0][1]<<endl;
    
    system("PAUSE");
    return EXIT_SUCCESS;
}



四 算法剖析

 

Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能:

1是直接从A到B,

2是从A经过若干个节点X到B。

所以,我们假设dis(AB)为节点A到节点B的最短路径的距离,对于每一个节点X,我们检查dis(AX) + dis(XB) < dis(AB)是否成立,如果成立,证明从A到X再到B的路径比A直接到B的路径短,我们便设置dis(AB)= dis(AX) +dis(XB),这样一来,当我们遍历完所有节点X,dis(AB)中记录的便是A到B的最短路径的距离。

 

注意点

三个循环的求中间点的K的循环必须放在外面。

因为如果放在内层,对于A—B之间的经过AX和BX的还没有求到最小值,所以A—B最后不是最小值

测试数据

Input:

4 4

0 1 11

1 2 2

2 3 3

3 0 4

Output :

 9



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香菜+

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值