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");
    }
}

posted on 2012-10-20 18:59  IThinktan  阅读(444)  评论(0编辑  收藏  举报

导航