数据结构课程设计:两顶点之间最短路径

问题描述:数据结构上机实验报告题5:
设计并实现一个交通资讯系统。能够让旅客咨询从任何一个城市顶点到另一个城市顶点之间的最短路径问题。
要求:能够输出旅客所走路径
作者:何知令

完成时间:2016年6月25日

解题思想:

使用弗洛伊德算法依次遍历图中每个顶点,考量将其加入到图中任意两个顶点之间是否会使该两个顶点之间的路径(当前)剪短,若是,则在path[i][j]中记录下该顶点。依次迭代就可以得到图中任意两顶点之间的最短路径

难点:难点在于怎样理解该算法只在两顶点之间插如一个顶点但实现了长路径的求解,以及用于存储路径顶点和往前递归寻找路径顶点的过程

代码:

/*
问题描述:数据结构上机实验报告题5:
设计并实现一个交通资讯系统。能够让旅客咨询从任何一个城市顶点到另一个城市顶点之间的最短路径问题。
要求:能够输出旅客所走路径
作者:何知令
完成时间:2016年6月25日
*/
#include <stdio.h>
#define INF 32767       //INF表示∞
int a,b;//起点和终点
int path[7][7];//用于存放路径
int A[7][7]=//每个城市到另一个城市的路径,-1表示该城市到另一城市没有直接路径或者到自身
    {
        {0,4,6,6,INF,INF,INF},
        {4,0,1,INF,7,INF,INF},
        {6,1,0,2,6,4,INF},
        {6,INF,2,0,INF,5,INF},
        {INF,7,6,INF,0,1,6},
        {INF,INF,4,5,1,0,8},
        {INF,INF,INF,INF,6,8,0}
    };
void Ppath(int i,int j)  //前向递归查找路径上的顶点
{
    int k;
    k=path[i][j];
    if (k==-1) return;  //找到了起点则返回
    Ppath(i,k);    //找顶点i的前一个顶点k
    printf("%d,",k);
    Ppath(k,j);    //找顶点k的前一个顶点j
}
void Floyd()
{
    int i,j,k;
    for (i=0; i<7; i++)
        for (j=0; j<7; j++)
            path[i][j]=-1;
    for (k=0; k<7; k++)
    {
        for (i=0; i<7; i++)
            for (j=0; j<7; j++)
                if (A[i][j]>A[i][k]+A[k][j])
                {
                    A[i][j]=A[i][k]+A[k][j];
                    path[i][j]=k;
                }
    }
}
int main()
{
    int i,j;
    printf("下为一个城市的交通图(领接矩阵形式):\n");
    for(i=0; i<7; i++)
    {
        for(j=0; j<7; j++)
        {
            if(A[i][j]==INF)
                printf("\tINF\t");
            else
                printf("\t%d\t",A[i][j]);
            if(j==6)
                printf("\n");
        }
    }
    printf("请输入起点和终点:\n");
    scanf("%d %d",&a,&b);
    Floyd();
    printf("从城市%d到城市%d的路径长度:%d 路径为:",a,b,A[a][b]);
    printf("%d,",a);    //输出路径上的起点
    Ppath(a,b);    //输出路径上的中间点
    printf("%d\n",b);   //输出路径上的终点
    return 0;
}
程序运行结果展示:


知识点总结:弗洛伊德算法及图的邻接矩阵

学习心得:开始怎么读都读不懂,后来还是老老实实在纸上写写,仔细想了想迭代的过程和具体实现长路径距离的寻找过程,才明白这个算法是怎么回事

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值