最短路径算法----Floyd算法

#include<stdio.h>
#include<stdlib.h>
typedef int VertexType;//顶点类型
typedef int EdgeType;
#define MAXVEX 100//最大顶点数
#define MAXEDGE 200//最大边数
#define INFINITY 65535//代表无穷大,两个顶点之间不可达
int visited[MAXVEX];//访问标志的数组
typedef struct{
    
    

    VertexType vexs[MAXVEX];//顶点表
    EdgeType arc[MAXVEX][MAXVEX];//邻接矩阵
    int numVertexes,numEdges;//图中当前的顶点数和边数

}MGraph;

void CreateMGraph(MGraph * G)
{
    
    
    int i,j,k,w;
    printf("输入顶点数和边数:");
    scanf("%d %d",&G->numVertexes,&G->numEdges);
      printf("输入顶点:");
    for(i=0;i<G->numVertexes;i++)
        scanf("%d",&G->vexs[i]);
       // getchar();
    for(i=0;i<G->numVertexes;i++)
        for(j=0;j<G->numVertexes;j++)
        G->arc[i][j]=INFINITY;//邻接矩阵初始化
    for(k=0;k<G->numEdges;k++)
    {
    
    

        printf("请输入vi vj的下标i j和对应的权值:");
        scanf("%d %d %d",&i,&j,&w);
        G->arc[i][j]=w;
        G->arc[j][i]=G->arc[i][j];//无向图,邻接矩阵对称
    }
}

void Floyd(MGraph G)
{
    
    
    int v,w,k;
    int p[MAXVEX][MAXVEX];//保存路径的数组
    int d[MAXVEX][MAXVEX];//保存权值的数组
    for(v=0;v<G.numVertexes;v++)
    {
    
    
        for(w=0;w<G.numVertexes;w++)
        {
    
    
            d[v][w]=G.arc[v][w];//设置初始最短路径即为输入的权值
            p[v][w]=w;//a--->b初始时的最短路径就是a-b
        }
    }


    for(k=0;k<G.numVertexes;k++)
    {
    
    
        for(v=0;v<G.numVertexes;v++)
        {
    
    
            for(w=0;w<G.numVertexes;w++)//经过中间结点比两点之间的距离要短则更新
            {
    
    
                if(d[v][w]>(d[v][k]+d[k][w]))
                {
    
    
                    d[v][w]=d[v][k]+d[k][w];//更新最短长度
                    p[v][w]=p[v][k];//更新经过的结点路径
                }
            }
        }
    }

    //--------输出最短路径
    for(v=0;v<G.numVertexes;v++)
    {
    
    
        for(w=v+1;w<G.numVertexes;w++)
        {
    
    
            printf("(%d,%d)--%d ",v,w,d[v][w]);
            k=p[v][w];
            printf("path: %d",v);
            while(k!=w)
            {
    
    
                printf("-> %d",k);
                k=p[k][w];//获得下一个路径顶点下标
            }
            printf("-> %d\n",w);
        }
        printf("\n");
    }
}
int main()
{
    
    
    MGraph *G;
    G=(MGraph*)malloc(sizeof(MGraph));
    CreateMGraph(G);
    Floyd(*G);
    return 0;
}

/*
0 1 1
0 2 5
1 2 3
1 3 7
1 4 5
2 4 1
2 5 7
3 4 2
3 6 3
4 6 6
4 7 9
4 5 3
5 7 5
6 7 2
6 8 7
7 8 4
时间复杂度O(n^3)
*/


在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43478694/article/details/107699414