弗洛伊德算法求解最短路径

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图2.3 添加城市流程图 开始
输入城市 p=q=0 否 q<g.n 是 否
p=1
是 是
path=-1 111 输入dis distance=99999
distance=dis
g.n++ 结束
2.4修改城市距离
根据屏幕上的城市编号,输入想更改的城市编号。在进行 该模块时会输出原来的距离。由于在现实生活中由于一些人为 的测量误差或是一些自然因素,又或是城市整编等等一系列的 因素需要改动原来的城市距离,此时应用该块修改的功能即可 实现更改,且根据提示操作简单,用户具体可以参看第四章: 测试及运行结果。流程图中p,q表示城市的编号,根据p和q可 以找到对应的城市名称,找到对应的g.v[p][q].distance即是原来 两城市间的距离。
图2.2 构建城市无向图流程图 开始 输入城市
p=0,q=0 否 q<MAX 是 否 P<MAX 是 g.v[p][q].path=-2; g.v[q][q].distance=0
return g 结束
2.3添加城市
用户根据提示输入想要添加到无向图中的城市,根据屏幕 中的提示输入与之邻接的城市间的距离,然后添加城市距离矩 阵图中;同时将g.v[m][n].path赋值为-1即表示p城到q城有路可 达且最短路径无需经过其他城市。需注意的是当g.v[m] [n].distance=0表示p城到q城的距离为0,当g.v[m] [n].distance=99999,则表示p城到q城距离无穷大即表示他们之 间无路径可达,而当g.v[m][n].distance=k(0<k<99999)时表示他 们间的距离是k。流程图中g.n表示当前图中存储的城市数量, dis表示输入的城市间的距离即q和g.n表示城市间的距离。通过 q<g.n的条件判断来充分完成图对应的矩阵中的赋值。
2) 利用矩阵保存城市间的距离; 3) 利用Floyd算法求最短路径; 4) 独立完成系统的设计,编码和调试; 5) 系统利用C语言完成; 6) 按照课程设计规范书写课程设计报告。 参考资料: 《算法与数据结构》 《C语言程序设计》 教研室审核意见: 指导教 师(签 名) 学 生 (签 名) 教研室主任签字: 年 月 日
3.2 调试中期
在上机输入完程序后,出现了许多错误,其中有一些小错 误,比如说忘记写分号,在这些错误上双击,找到位置,加上 分号。还有就是程序中的有的变量在前面没有定义,只要在前 面添加上就可以了。 再有就是前后的类型要保持一致,在这块我也犯了个错 误。前面是指针类型,后面却是取地址类型,解决办法就是把 前面的改成指针类型,保持前后一致。 还有就是遗忘分号,逗号,解决方法就是,一步一步的把遗忘 的分号,逗号补上。
图2.1 主模块流程图 开始
输入选择n 退出 求最短路径 修改城市距离 建城市无向图图 添加城市 Exit 退出程序 调用各子函数
结束
2.2构建城市无向图
根据提示输入城市,对城市无向矩阵图进行初始化,开始 g.v[m][n].path的路径值赋为-2表示p城到q城间中间没有可达 的路径不经过其他城市,而g.v[m][n].distance赋值为0表示p 到p的距离为0。流程图中的MAX表示的是最多的城市数 量,其值为20;p,q表示城市的编号,而path和distance分 别表示的路径和城市间距离。g.v[p][q].distace表示p、q代表 的城市间的距离
第2章 详细设计
2.1主模块
用户根据屏幕上显示的操作提示输入要进行操作的模块, 通过调用相对应的模块程序,达到用户所想进行操作。程序的 总框架大致分为四个模块:1.建立城市无向图2.添加城市模块 3.修改城市距离4.求最短路径。具体实现过程见2.2:建立城 市无向图2.3:添加城市2.4:修改城市距离2.5:求最短路 径。流程图中通过输入n,由n的值来选择调用相对应子函数, 实现所选择的功能,调用完后可以返回调用主函数进行下一次 选择,从而实现反复调用子函数而实现四个模块的功能等。
7
第1章 概要设计
1.1题目的内容与要求
内容:给出一张无向图,图上的每个顶点表示一个城市, 顶点间的边表示城市间存在路径,边上的权值表示城市间的距 离。试编写程序求解从某一个城市出发到达任意其他任意城市 的最短路径问题。 要求: 1) 能够提供简单友好的用户操作界面,可以输入城市的基 本信息,包括城市名称,城市编号等; 2) 利用矩阵保存城市间的距离; 3) 利用Floyd算法求最短路径; 4) 独立完成系统的设计,编码和调试; 5) 系统利用C语言完成; 6) 按照课程设计规范书写课程设计报告。
课程设计任务书
课程 设计 名称 学生 姓名 题目 名称 起止 日期 数据结构课程设计 专业 计算机科学与技 术 (物联网方向)
班级
学号
最短路径求解 2015 年 1 月
5
日 起 至
2015

1
月 16
日 止
课设内容和要求: 内容:给出一张无向图,图上的每个顶点表示一个城 市,顶点间的边表示城市间存在路径,边上的权值表示城市 间的距离。试编写程序求解从某一个城市出发到达任意其他 任意城市的最短路径问题。 要求: 1) 能够提供简单友好的用户操作界面,可以输入城市的基本 信息,包括城市名称,城市编号等;




第1章 概要设计 1 1

1.1题目的内容与要求 1.2总体结构 1 第2章 详细设计 2 2.1主模块 2 2.2构建城市无向图 3 2.3添加城市 4 2.4修改城市距离 5 2.5求最短路径 6
第3章 调试分析 3.1 调试初期 3.2 调试中期 3.3 调试末期 7 7 7
7
第4章 测试及运行结果 附页(程序清单) 10
1.2总体结构
本程序主要分为四个模块(功能模块见图1.1):主模块对 整个程序起一主导作用,开始构建一城市无向图,对其进行添 加城市顶点,以及对原来的距离数据进行修改,整体构建结束 可以实现求一城市到其他城市的最短路径问题。
添加城市 顶点
Floyd算法求最短路径 修改城市距离 求最短路径 建 城市 图 图1.1 功能模块图
附页(程序清单)
#include "stdafx.h" #include<stdio.h> #include<string.h> #include<stdlib.h> #include <malloc.h> #define MAX 20 //城市数量 typedef struct{ int path; int distance;
第4章 测试及运行结果
建图过程:根据屏幕上的显示输入,你会看到如下界面;
添加城市过程:根据界面提示操作,结果如下,添加一城市后如下:
我总共添加了三个城市,最后结果如下界面:
求最短路径过程:根据提示我输入了0 2号城市编号,结果如下:
同理根据提示输入要修改的城市编号,输入后,屏幕上会显示 原来的距离,输入修改后的距离即可修改成功。
输入城市求路径
第3章 调试分析
3.1 调试初期
由于编写的程序具有模块化的特性,且VC 6.0 的调试显 然由于TC及个人对VC的熟练程度远优于TC等方面,我选择先在 VC 6.0环境下完成除图形化演示算法过程函数的其他过程。 由于数据结构选择的较合理,对Floyd算法的理解较为深 刻,所以在此环境下的调试并没有太多困难。
忘记定义变量的类型。比i应该是整型的却忘记申明。解决 方法就是在函数内先申明int 类型的i.。粗心导致很多细节问 题,比如该输入英文的括号的,却输成中文的括号,解决方 法,把中英文分开。注意细节问题。
3.3 调试末期
输入的数据无法找出正确的路径,解决方法,一步一步的 调试,找出问题的所在,改正逻辑错误。在同学的帮助下,找 到了逻辑错误,一步一步地改正,终于得到预期的结果。
} Vert; typedef struct{ int n;//存放顶点数 char name[MAX][60];//城市名称及编号 Vert v[MAX][MAX]; } Mgraph; void path(Mgraph g,int m,int n,int f) { int k,i,a[21]; for(i=0;i<21;i++) a[i]=-3; k=g.v[m][n].path; if(k>=0) { f++; a[f]=k; k=g.v[m][k].path; path(g,m,k,f); k=g.v[k][n].path; path(g,k,n,f); } for(i=1;a[i]>=0;i++) { printf("%s到%s途经:",g.name[m],g.name[n]); printf("%s ",g.name[a[i]] ); }
图2.4 修改城市距离流程图 开始 输入p,q 输出原来距离 输入修改 的距离s
g.v[p][q].distance =s
return g
结束
2.5求最短路径
利用Floyd求最短路径,假设vi到 vj存在路径,长度为k,假 设vi到vj经过vk(i=0 1…..n)长度为m,比较k和m,如果k>m,则 d(vi,vj)=m,否则为k,依次类推,直到所有的vi到vj的中间城市 比较完,最后d(vi,vj)的值即为最短距离,同时在比较的过程中 保存路径信息,最后在查询时即可输出路径。具体见第四章: 测试及运行结果中求最短路径界面
图2.4 修改城市距离流程图 开始 i=j=k=0 k<g.n-1
否 是 否
i<g.n-1
是 否
j<g.n
是 是
百度文库
g.v[i][j].distance>g.v[i][k].distance+g.v[k][j].distance;

g.v[i][j].distance=g.v[i][k].distance+g.v[k][j].distance path=k j++ k++ i++
} void Floyd(Mgraph g) { int i,j,k,m,n,h=0,w=0,f=0,s; for(k=0;k<g.n-1;k++) { for(i=0;i<g.n-1;i++) for(j=0;j<g.n;j++) {
if(g.v[i][j].distance>g.v[i][k].distance+g.v[k][j].distance) { g.v[i][j].distance=g.v[i][k].distance+g.v[k][j].distance; g.v[j][i].distance=g.v[i][j].distance; g.v[i][j].path=k; g.v[j][i].path=g.v[i][j].path; } } } printf("输入你要查询的两城市编号\n"); printf("以下是城市相对应的编号:\n"); for(i=0;i<g.n;i++) { w++; printf("%s: %d ",g.name[i],i); if(w%g.n==0) printf("\n"); } scanf("%d%d",&m,&n); printf("%s和%s的最短距离是%d\n",g.name[m],g.name[n],g.v[m] [n].distance); s=g.v[m][n].path; if(s==-1) printf("%s到%s最短路径不途经其他城市\n",g.name[m],g.name[n]); if(s>=0) path(g,m,n,f); } Mgraph Modify(Mgraph g) // 修改俩城市的数据 { int p,q,s; printf("输入要修改的两城市编号\n",g.v[p][q].distance); scanf("%d%d",&p,&q); printf("原来两城市距离为%d\n"); printf("修改两城市间的距离\n"); scanf("%d",&s); g.v[p][q].distance=s; return g;
} Mgraph ADD(Mgraph g) // 添加新的城市 { int p=0,q=0,dis; char s; printf("请输入添加城市的名字\n"); scanf("%s",&g.name[g.n]); for(q=0;q<g.n;q++) { printf("%s和%s是否邻接 是的:1 不是: 0\n",g.name[q],g.name[g.n]); scanf("%d",&p); if(p==1)//邻接信息 { g.v[q][g.n].path=-1; printf("请输入%s和%s间的距离\n",g.name[q],g.name[g.n]); scanf("%d",&dis); g.v[q][g.n].distance=dis; g.v[g.n][q].distance=dis; } else { g.v[q][g.n].distance=99999;//99999表示距离的无限大值 g.v[g.n][q].distance=99999;//99999表示距离的无限大值 } } g.n++; return g; }//添加结束 Mgraph Init(Mgraph g)//初始化一个邻接矩阵无向图 { int q=0,p=0; g.n=1; printf("请输入第一个城市的名称\n"); scanf("%s",g.name[0]); for(q=0;q<MAX;q++) for(p=0;p<MAX;p++)
相关文档
最新文档