Floyd算法(针对河大版教材错误修改)

旧巷老猫 提交于 2019-12-13 06:45:42

教材上Floyd算法最后打印出来的结果有点小问题 一开始着重于路径 path数组进行调整,先是调用n次Dijkstra算法 得到路径path 然后尝试调整Floyd算法中path数组。 浏览了网上其他的Floyd算法后,觉得问题不是在path数组上,而是在路径打印问题上,然后对路径打印做了些调整。 因本人能力有限,调整后的程序 也可能会有些许问题,恳请读者批评指正。

测试图 与数据 详见课本

#include <stdio.h>
#include <stdlib.h>
#define MaxVerNum 10
#define Infinity 1000
typedef struct
{
    char vertex[MaxVerNum];
    int edges[MaxVerNum][MaxVerNum];
    int vertex_num;
    int edge_num;
}MGraph;

void Create_MG(MGraph* G)
{
    int i,j,k,weight;
    printf("Please input the vertex_num and edge_num\n");
    scanf("%d %d",&(G->vertex_num),&(G->edge_num));
    for (i=0;i<G->vertex_num;i++)
    {
        printf("Please input the vertex\n");
        scanf(" %c",&(G->vertex[i]));
    }
    for (i=0;i<G->vertex_num;i++)
    {
        for (j=0;j<G->vertex_num;j++)
        {
            if (i==j)
            {
                G->edges[i][j]=0;
            } else
            {
                G->edges[i][j]=Infinity;
            }
        }
    }
    for (k=0;k<G->edge_num;k++)
    {
       // printf("Please input the edges\n");
        scanf("%d %d %d",&i,&j,&weight);
        G->edges[i][j]=G->edges[j][i]=weight;
    }
}
void Floyd(MGraph* G,int path[][MaxVerNum],int cost[][MaxVerNum])
{
    int i,j,k,temp;
    int tmp;
    /**初始化*/
    for (i=0;i<G->vertex_num;i++)
    {
        for (j=0;j<G->vertex_num;j++)
        {
            cost[i][j]=G->edges[i][j];
            path[i][j]=j;
        }
    }

    /**Floyd核心算法*/
    for (k=0;k<G->vertex_num;k++)
    {
        for (i=0;i<G->vertex_num;i++)
        {
            for (j=0;j<G->vertex_num;j++)
            {
                tmp=(cost[i][k]==Infinity||cost[k][j]==Infinity)?Infinity:(cost[i][k]+cost[k][j]);
                        if (tmp<cost[i][j])
                        {
                            cost[i][j]=tmp;
                            path[i][j]=k;
                        }
            }
        }
    }

    /**打印路径*/
    printf("\nFloyd\n");
    for (i=0;i<G->vertex_num;i++)
    {
        for (j=0;j<G->vertex_num;j++)
        {
            if (i==j)
            {
                continue;
            }
            /**书上 从v0到v3路径有问题 修改后从v0到v3的路径正确  却发现从v3到v0的路径仍有问题  因此在打印v3到v0的路径时 采用栈 将v0到v3的路径存入栈中 再将栈中的路径打印出来*/
            if (i<j)
            {
                temp=i;
                printf("v%d 到v%d的最短路径长度为:%d",i,j,cost[i][j]);
                printf("路径为: v%d",i);
                while(path[temp][j]!=j)
                {
                    k=path[temp][j];
                    temp=k;
                    printf("->v%d",k);
                }
                printf("->v%d\n",j);
            } else
            {
                temp=j;
                int Stack[MaxVerNum]={0},rear=-1;
                while(path[temp][i]!=i)
                {
                    k=path[temp][i];
                    temp=k;
                    Stack[++rear]=k;
                }
                printf("v%d 到v%d的最短路径长度为: %d",i,j,cost[i][j]);
                printf("路径为: v%d",i);
                while(rear>=0)
                {
                    printf("->v%d",Stack[rear--]);
                }
                printf("->v%d\n",j);

            }
        }
        printf("\n");
    }
}
int main(void)
{
    int cost[MaxVerNum][MaxVerNum],path[MaxVerNum][MaxVerNum];
    MGraph* G=(MGraph*)malloc(sizeof(MGraph));
    Create_MG(G);
    Floyd(G,path,cost);
    return 0;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!