弗洛伊德求每个顶点到其余各顶点的最短路径

Posted yshun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了弗洛伊德求每个顶点到其余各顶点的最短路径相关的知识,希望对你有一定的参考价值。

以5 a b 7 a d 4 b c 2 b d 3 c a 3 c b 2 c d 1 d c构造有向图并找出每个顶点到其余顶点的最短路径

#include <stdio.h>
#include <stdlib.h>
#define MaxVertexNum 100
#define BIG 100
typedef char VertexType;//顶点节点的数据类型
typedef int EdgeType;//边权值的数据类型
typedef struct
    VertexType Vertex[MaxVertexNum];//顶点表
    EdgeType Edge[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表
    int vertexnum,arcnum;//顶点数和边数
MGraph;//邻接矩阵的存储结构
int Locate(VertexType v)
    if(v>=97)return (int)v-97;
    else return (int)v-65;
//将顶点转换为相应的位置
void CreatGraph(MGraph &M)
    EdgeType e;
    VertexType v1,v2;
    printf("输入节点数和边数:");
    scanf("%d %d",&M.vertexnum,&M.arcnum);
    printf("输入节点:");
    for(int i=0;i<M.vertexnum;i++)
        getchar();
        scanf("%c",&M.Vertex[i]);
    
    for(int i=0;i<M.vertexnum;i++)
        for(int j=0;j<M.vertexnum;j++)
            M.Edge[i][j]=BIG;
            if(i==j)
                M.Edge[i][j]=0;
            
        
    
    fflush(stdin);//清除缓存,防止下一次的scanf()函数失效
    printf("输入路径的权值及其两个节点:\\n");
    for(int i=0;i<M.arcnum;i++)
        scanf("%d %c %c",&e,&v1,&v2);
        M.Edge[Locate(v1)][Locate(v2)]=e;
    
//构造一个有向图
void PrintGraph(MGraph &M)
    printf("邻接矩阵\\n");
    for(int i=0;i<M.vertexnum;i++)
        printf("     %c ",M.Vertex[i]);
        for(int j=0;j<M.vertexnum;j++)
            if(M.Edge[i][j]!=BIG)
                printf("%d  ",M.Edge[i][j]);
            
            elseprintf("");
        
        printf("\\n");
    
//打印邻接矩阵
void visited(int v)
    printf("%c ",v+a);
//访问当前节点的位置
void Floyd(MGraph &M,int path[MaxVertexNum][MaxVertexNum])
    int A[M.vertexnum][M.vertexnum];//记录数组中任意两个顶点之间的最短距离
    for(int i=0;i<M.vertexnum;i++)
        for(int j=0;j<M.vertexnum;j++)
            A[i][j]=M.Edge[i][j];
            path[i][j]=-1;
        
    
    for(int k=0;k<M.vertexnum;k++)
        for(int j=0;j<M.vertexnum;j++)
            for(int i=0;i<M.vertexnum;i++)
                if(A[i][j]>A[i][k]+A[k][j])
                    A[i][j]=A[i][k]+A[k][j];
                    path[i][j]=k;
                
            
        
    
    printf("A矩阵\\n");
    for(int i=0;i<M.vertexnum;i++)
        printf("      ");
        for(int j=0;j<M.vertexnum;j++)
            printf("%d ",A[i][j]);
        
        printf("\\n");
    
    printf("path矩阵\\n");
    for(int i=0;i<M.vertexnum;i++)
        printf("      ");
        for(int j=0;j<M.vertexnum;j++)
            printf("%d ",path[i][j]);
        
        printf("\\n");
    

int main()
    MGraph M;
    CreatGraph(M);
    PrintGraph(M);
    int path[MaxVertexNum][MaxVertexNum];//记录当前两节点间要经过的中间节点
    Floyd(M,path);

技术图片

 

以上是关于弗洛伊德求每个顶点到其余各顶点的最短路径的主要内容,如果未能解决你的问题,请参考以下文章

弗洛伊德(Floyd)算法

求有向图两个顶点间的最短路径的方法,用简单语言或举例描述。

最短路径算法——弗洛伊德算法(Floyd)

用Dijkstra算法求图中从顶点a到其他各顶点间的最短路径,并写出执行算法过程中各步的状态。

最短路径 - 迪杰斯特拉(Dijkstra)算法

最短路径--弗洛伊德算法[求任意一对顶点间的最短路径]