数据结构与算法课程设计 求解最短路径

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档