Floyd算法

求每两个顶点之间的最短距离

#include<iostream>

using namespace std;



#define    N 100//最大顶点个数

#define INF 32767 

typedef struct//图的邻接矩阵类型

{      

    int edges[N][N]; //邻接矩阵

       int vexnum,arcnum; //顶点数,弧数

    //int vexs[N];//存放顶点信息---如该顶点的下一个顶点

} MGraph;

void DispMG(MGraph g);//输出邻接矩阵

void Floyd(MGraph g);//弗洛伊德算法---计算每对顶点之间的最短路径

void DisPath(int A[][N],int Path[][N],int n);//输出路径

void PPath(int Path[][N],int i,int j);



int main()

{

    /*int A[N][6]={

                    {INF,5,INF,7,INF,INF},

                    {INF,INF,4,INF,INF,INF},

                    {8,INF,INF,INF,INF,9},

                    {INF,INF,5,INF,INF,6},

                    {INF,INF,INF,5,INF,INF},

                    {3,INF,INF,INF,1,INF}

                };*/

    int A[N][6]={    {INF,INF,10 ,INF,30 ,100},

                    {INF,INF,5  ,INF,INF,INF},

                    {INF,INF,INF,50 ,INF,INF},

                    {INF,INF,INF,INF,INF,10 },

                    {INF,INF,INF,20 ,INF,60 },

                    {INF,INF,INF,INF,INF,INF}

                };

    MGraph g;//实例化邻接矩阵

    g.vexnum=6;

    g.arcnum=10;//6个顶点,10条边

    for (int i=0;i<g.vexnum;i++)

        for (int j=0;j<g.vexnum;j++)

            g.edges[i][j]=A[i][j];



    printf("有向图G的邻接矩阵:\n");

    DispMG(g);//输出邻接矩阵

    Floyd(g);//调用算法并输出每两点之间的距离

    return 0; 

}





void Floyd(MGraph g)//弗洛伊德算法从每对顶点之间的最短路径

{

    int i,j,k;

    int Arr[N][N],Path[N][N];//Arr[][]---记录各点间的最小距离,path[][]---记录路径中间节点    

    for (i=0;i<g.vexnum;i++)

        for (j=0;j<g.vexnum;j++)//给Arr[][]置初值 

        {    

            Arr[i][j]=g.edges[i][j];//

            Path[i][j]=-1;//从i到j中间经过的点为path[][]---没有时为-1

        }

    for (k=0;k<g.vexnum;k++)//中间节点控制---中间节点不大于k(实际上用的就是k)

    {

        for (i=0;i<g.vexnum;i++)

            for (j=0;j<g.vexnum;j++)//遍历Arr[][],看每一个节点经过k点到达所有其他节点的距离有无改善(更小)

                if (Arr[i][j]>(Arr[i][k]+Arr[k][j])) 

                {    

                    Arr[i][j]=Arr[i][k]+Arr[k][j];

                    Path[i][j]=k;//从顶点i到顶点j的中间点为k

                }

    }

    printf("\n输出最短路径:\n");

    DisPath(Arr,Path,g.vexnum);   /*输出最短路径*/

}

void DisPath(int A[][N],int Path[][N],int n)

{

    int i,j;

    for (i=0;i<n;i++)

        for (j=0;j<n;j++) 

            if(A[i][j]==INF)

            {

                if(i!=j)//交通路径中---到达自身节点本就是0距离

                    printf("从%d到%d没有路径\n",i,j);

            }

            else 

            {    

                printf("从%d到%d路径长度为:%d",i,j,A[i][j]);

                printf("\t路径为:");printf("%d,",i);PPath(Path,i,j);

                printf("%d\n",j);

            }

} 

void PPath(int Path[][N],int i,int j) 

{

    int k=Path[i][j];

    if (k==-1)  return;

    PPath(Path,i,k);

    printf("%d,",k);

    PPath(Path,k,j);

}

void DispMG(MGraph g)/*输出邻接矩阵*/

{

    int i,j;

    for (i=0;i<g.vexnum;i++)

    {

        for (j=0;j<g.vexnum;j++)

            if (g.edges[i][j]==INF)

                  printf("%4s","");

            else  printf("%4d",g.edges[i][j]);

        printf("\n");

    }

}

你可能感兴趣的:(floyd)