数据结构与算法课程设计 求解最短路径
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
综合实验任务书
设计名称:求解最短路径日期:2009年1 月 2 日
设计内容:
设计一个系统,实现以下功能:
1:建立图
2:实现Dijkstra单源点最短路径算法
3:实现Floyd算法,实现求解每对结点之间的最短路径问题
4:退出系统
设计目的与要求:
(1)达到理论与实际应用相结合,能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养良好的程序设计技能。
(2)在实践中认识为什么要学习数据结构,掌握数据结构、程序设计语言程序设计技术、之间的关系。通过设计,在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解和综合运用。
设计环境或器材、原理与说明:
Microsoft Visual C++ 6.0
设计过程(步骤)或程序代码:
#include
#include
#define MAX 10000
#define MAXLEN 20
#define MAX_VERTEX_NUM 20
typedef struct
{
char vexs[MAX_VERTEX_NUM]; //顶点表
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵
int vexnum,arcnum; //图的顶点数和弧数}MGRAPH;
MGRAPH create_mgraph() //建立有向图的邻接矩阵结构{
int i,j,k,h;
MGRAPH mg;
printf("\n\n输入顶点数和边数(用逗号隔开) : ");
while(1) //判断输入是否合法
{
if(scanf("%d,%d",&i,&j)==2&&getchar()=='\n'&&i else { while(getchar() != '\n') ; cout <<"输入不合法!"< printf("请重新输入顶点数和边数(用逗号隔开):"); } } mg.vexnum=i; //存放顶点数在mg.vexnum中mg.arcnum=j; //存放边点数在mg.arcnum中fflush(stdin); //清空缓冲区 for(i=0;i { printf("输入顶点%d 的值:",i+1); //输入顶点的值 while(1) //判断选择是否合法 { if(scanf("%d",&mg.vexs[i])==1&&getchar()=='\n') break; else { while(getchar() != '\n') ; cout <<"输入不合法!"< printf("请重新输入顶点%d 的值:",i+1); } } fflush(stdin); } for(i=0;i mg.arcs[i][j]=MAX; for(k=1;k<=mg.arcnum;k++) { printf("输入第%d 条边的起始顶点和终止顶点(用逗号隔开): ",k); while(1) //输入弧的起始顶点和终止顶点,并判断输入是否合法 { /* scanf("%d,%d", &i, &j)的作用:判断是否成功输入 如果i和j都被成功读入,那么scanf的返回值就是2 如果只有i被成功读入,返回值为1 如果i和j都未被成功读入,返回值为0 */ if(scanf("%d,%d",&i,&j)==2&&getchar()=='\n'&&i>0&&i<=mg.vexnum&&j>0&&j< =mg.vexnum) break; else { while(getchar() != '\n') ; cout <<"输入不合法!"< printf("请重新输入起始顶点和终止顶点(用逗号隔开):"); } } fflush(stdin); while(i<1||i>mg.vexnum||j<1||j>mg.vexnum) { printf("输入错,重新输入: "); scanf("%d,%d",&i,&j); } printf("输入此边权值:"); //输入弧上之权值 while(1) //判断输入是否合法 { if(scanf("%d",&h)==1&&getchar()=='\n') break; else { while(getchar() != '\n') ; cout <<"输入不合法!"< printf("请重新输入此边权值:"); } } mg.arcs[i-1][j-1]=h; } return mg; } void Dijkstra(MGRAPH mg) { int cost[MAXLEN][MAXLEN]; int path[MAXLEN], flag[MAXLEN]; int dist[MAXLEN]; int i,j,n,v0,min,u,back=0; printf("\n求有向图单源点最短路径\n"); printf("\n\n起始顶点为:"); //有向图中顶点的编号从1编起 while(1) //判断选择是否合法 { if(scanf("%d",&v0)==1&&getchar()=='\n'&&v0<=mg.vexnum) break; else