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

以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]);
            }
            else{printf("");}
        }
        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);
}

猜你喜欢

转载自www.cnblogs.com/Yshun/p/11421356.html