城市之间最短路径管理软件.docx

上传人:b****5 文档编号:6912700 上传时间:2023-01-12 格式:DOCX 页数:22 大小:1.03MB
下载 相关 举报
城市之间最短路径管理软件.docx_第1页
第1页 / 共22页
城市之间最短路径管理软件.docx_第2页
第2页 / 共22页
城市之间最短路径管理软件.docx_第3页
第3页 / 共22页
城市之间最短路径管理软件.docx_第4页
第4页 / 共22页
城市之间最短路径管理软件.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

城市之间最短路径管理软件.docx

《城市之间最短路径管理软件.docx》由会员分享,可在线阅读,更多相关《城市之间最短路径管理软件.docx(22页珍藏版)》请在冰豆网上搜索。

城市之间最短路径管理软件.docx

城市之间最短路径管理软件

重庆大学实验报告

 

实验题目:

城市之间最短路径管理软件

 

学院:

计算机学院

专业班级:

年级:

2011

姓名:

学号:

完成时间:

2013年6月17日

指导教师:

 

重庆大学教务处制

实验项目指导教师评定成绩表

学号:

姓名班级:

项目

分值

参考标准

评分

学习态度

10

积极与老师、助教讨论(10分)

学习马虎,纪律涣散(5分)

缺勤(0分)

软件/系统质量

60

功能考虑完善,界面友好,Bug极少,针对异常情况有处理(55-60分)

功能考虑完善,界面良好,有一定Bug(49-54分)

功能较完善,Bug较多(43-48分)

完成程序基本功能(36-42分)

部分实现,无法运行(1-35分)

抄袭、被抄袭(0分)

实验演示答辩

10

重点突出、有特色、专业知识掌握好、能流畅回答老师提问(9-10分)

有一定特色、能较好地回答老师提问(7-8分)

能讲解项目的关键实现,能回答基本问题(0-6分)

实验报告撰写质量

20

文档规范,文字、图表表达清楚(18-20分)

文档较规范,文字、图表表达较清楚(11-17分)

文档不规范,内容空泛、结构混乱(0-10分)

指导教师评定成绩:

指导教师签名:

年月日

重庆大学本科学生实验项目任务书

实验题目

城市之间最短路径管理软件

学院

计算机学院

专业

年级

2011

任务描述:

以项目组形式,实现项目所要求的功能。

项目组每组2~4人,其中项目组长1人,负责项目整体进度和协调项目组成员之间的工作,要求项目组成员分工明确,各自的工作量均衡,并在实践报告中注明每个人的分工和工作量。

综合运用C++编程技术和Dijkstra算法和Floyd算法,用VS2010或QT设计实现一个简单的城市之间最短路径管理软件,该软件能够模拟实现简单的路径维护、求解单源最短路径、求解所有节点间最短路径等功能。

最后提交完整的设计报告和软件程序拷贝。

设计要求:

1.编写软件帮助旅行者了解从一个城市到另一个城市之间的最短路径。

2.程序接受用户输入城市列表(包含城市名称信息)和连接用户城市的路径列表(包含距离信息),在软件运行过程中这些信息均可修改。

要求城市数量不少于10,路径数量在30左右。

3.用户可以根据需要指定一个源点,软件需计算出该源点到其他剩余节点之间的最短距离和详细路径。

4.用户可以直接查看所有城市之间的最短距离。

参考资料:

☐DataStructuresandAlgorithmAnalysis(C++Version)CliffordA.Shaffer

☐DataStructureandAlgorithmAnalysisinC++(ThirdEdition),MarkAllenWeiss,PearsonEducation,2006.

☐DataStructures,Algorithms,andApplicationsinC++,SartajSahni,McGraw-Hill,1998.

☐《数据结构(C语言版)》,严蔚敏,吴伟民编著,清华大学出版社,2007年第1版

任务下达日期2013年4月10日

完成日期2013年6月17日

说明:

学院、专业、年级均填全称,如:

计算机学院、计算机科学与技术、2011。

实验报告正文

一.需求分析

随着现在科技的迅速发展,我们的生活节奏也越来越快,因此我们需要规划好我们的日程安排,我们的路程也不例外,我们需要尽可能地节约时间来完成我们其它的事情,所以拥有一个可以为我们计算最短路径的软件是一个不错的选择。

为了响应广大用户的需求,我写了一个城市之间最短路径管理软件,用户只需将地图中的所有城市和其距离写入一个文件中,即可用此软件计算所有的最短路径。

我的然间可以帮助用户实现以下功能:

1.帮助旅行者了解从一个城市到另一个城市之间的最短路径。

2.程序接受用户输入城市列表(包含城市名称信息)和连接用户城市的路径列表(包含距离信息),在软件运行过程中这些信息均可修改。

3.用户可以根据需要指定一个源点,软件需计算出该源点到其他剩余节点之间的最短距离和详细路径。

4.用户可以直接查看所有城市之间的最短距离。

二.系统设计

1.类图

2.模块图

利用Dijkstra算法计算单源最短路径

根据用户的输入信息构图

利用Floyd

算法计算所有节点之间的最短路径

主函数调用构图函数构图,调用Dijkstra算法和Floyd算法,并将结果写入相应的文件中

 

 

三.关键代码描述

#include

#include

#include

#include"link.h"

#include"list.h"

#include"llist.h"

#include"book.h"

#include"graph.h"

#include"grmat.h"

usingnamespacestd;

intn,m;//n为城市个数,m为路径的个数

LListMAP;//用链表存储城市及其标号

GraphmG(n);

voidCREATGRAPH(){//从文件中的相关数据构图

ifstreamfile1("map.txt");//文件的格式见map.txt

if(!

file1.good()){

cout<<"不能打开文件map.txt,请检查是否有该文件存在";

system("pause");

}

file1>>n>>m;

int**Map=newint*[n];

for(inti=0;i

Map[i]=newint[n];

for(inti=0;i

for(intj=0;j

Map[i][j]=0;

//将地图中的城市及其标号存入链表MAP中

for(inti=0;i

charstr1;

charnum[256];

stringstr2;

intlable;

intp=0;

while(file1>>str1){

if(str1=='(')

continue;

elseif(str1>=48&&str1<=57){

num[p]=str1;

p++;

}

elseif(str1==')'){

num[p]='\0';

lable=atoi(num);

}

elseif(str1<0)

str2+=str1;

elseif(str1==','){

MAP.append(lable,str2);

break;

}

elseif(str1=='!

'){

MAP.append(lable,str2);

break;

}

elsecontinue;

}

}

//将城市间的距离存入矩阵Map中

for(inti=0;i

charstr;

charnum[256];

intlable1,lable2,wght;

intp=0;

while(file1>>str){

if(str>=48&&str<=57){

num[p]=str;

p++;

}

elseif(str=='-'){

num[p]='\0';

lable1=atoi(num);

p=0;

}

elseif(str==':

'){

num[p]='\0';

lable2=atoi(num);

p=0;

}

elseif(str==','){

num[p]='\0';

wght=atoi(num);

break;

}

elseif(str=='!

'){

num[p]='\0';

wght=atoi(num);

break;

}

elsecontinue;

}

Map[lable1][lable2]=wght;

}

file1.close();

//根据矩阵中的距离信息构图

G.Init(n);

intflag;

cout<<"0代表无向图,1代表有向图,请选择二进制数0或1"<

cin>>flag;

if(flag==1){//根据用户的信息构有向图

for(intlab1=0;lab1

for(intlab2=0;lab2

if(lab1!

=lab2){

if(Map[lab1][lab2]!

=0)

G.setEdge(lab1,lab2,Map[lab1][lab2]);

elseG.setEdge(lab1,lab2,INFINITY);

}

elsecontinue;

}

cout<<"构图成功!

"<

}

elseif(flag==0){//根据用户的信息构无向图

for(intlab1=0;lab1

for(intlab2=0;lab2

if(lab1!

=lab2){

if(Map[lab1][lab2]!

=0){

G.setEdge(lab1,lab2,Map[lab1][lab2]);

G.setEdge(lab1,lab2,Map[lab1][lab2]);

}

elseG.setEdge(lab1,lab2,INFINITY);

}

elsecontinue;

}

cout<<"构图成功!

"<

}

else{

cout<<"由于您输入了系统无法辨认的数字"<

cout<<"若想继续计算城市间的最短路径,请重新启动该软件*_*"<

system("pause");

}

}

intminVertex(Graph*G,int*D){//Findmincostvertex

inti,v=-1;

//Initializevtosomeunvisitedvertex

for(i=0;in();i++)

if(G->getMark(i)==UNVISITED){v=i;break;}

for(i++;in();i++)//NowfindsmallestDvalue

if((G->getMark(i)==UNVISITED)&&(D[i]

v=i;

returnv;

}

//Computeshortestpathdistancesfrom"s".

//Returnthesedistancesin"D".

int*pre=newint[G.n()];//定义一个一维矩阵记录路径

voidDijkstra(Graph*G,int*D,ints){

for(intj=0;jn();j++)

pre[j]=s;

inti,v,w;

for(i=0;in();i++){//Processthevertices

v=minVertex(G,D);

if(D[v]==INFINITY)return;//Unreachablevertices

G->setMark(v,VISITED);

for(w=G->first(v);wn();w=G->next(v,w))

if(D[w]>(D[v]+G->weight(v,w))){

D[w]=D[v]+G->weight(v,w);

pre[w]=v;

}

}

}

int**P=newint*[G.n()];//定义一个二维矩阵

//Floyd'sall-pairsshortestpathsalgorithm

//Storethepair-wisedistancesin"D"

voidFloyd(Graph*G){//计算所有节点之间距离的算法

for(inti=0;in();i++)//InitializeDwithweights

for(intj=0;jn();j++)

if(G->weight(i,j)!

=0)P[i][j]=G->weight(i,j);

for(intk=0;kn();k++)//Computeallkpaths

for(inti=0;in();i++)

for(intj=0;jn();j++)

if(P[i][j]>(P[i][k]+P[k][j]))

P[i][j]=P[i][k]+P[k][j];

}

//主函数调用部分

intmain(){

CREATGRAPH();//调用构图函数

//*************************************************//

cout<<"地图中的所有城市及其编码如下:

"<

for(inti=0;i

MAP.moveToPos(i);

cout<

}

int*D=newint[G.n()];

for(inti=0;i

D[i]=INFINITY;

//*********************************************//

stringcity;

cout<

cout<<"请输入您的源点城市名字"<

cin>>city;

ints;

for(inti=0;i

MAP.moveToPos(i);//在的话找到其相应的标号

if(MAP.getCity()==city){

s=MAP.getLable();

break;

}//不在的话输出提示信息

elseif((i==MAP.length()-1)&&MAP.getCity()!

=city){

cout<<"您所输入的源点不在图中,请检查输入!

"<

cout<<"若想继续查找单源城市最短路径,请重新启动该软件!

"<

system("pause");

}

elsei++;

}

D[s]=0;

//*************************************************//

//调用Dijkstra算法计算并输出单源最短路径

Dijkstra(&G,D,s);

cout<

ofstreamfile2;

file2.open("single-path1.txt");

file2<

"<

for(intk=0;k

MAP.moveToPos(k);//single-path1中

file2<

";

if(D[k]==INFINITY||D[k]==9999){

file2<<"无路径可达"<

}

else{

intz=k;

MAP.moveToPos(z);

file2<";

while(pre[z]!

=s){

MAP.moveToPos(pre[z]);

file2<";

z++;

}

file2<

";

file2<

}

}

file2<

file2.close();

cout<

cout<

//**************************************************//

//调用Floyd算法计算并输出所有城市之间的最短路径距离

ofstreamfile3;

file3.open("all-path1.txt");

inti,j;

file3<<"所有节点之间的最短距离:

"<

for(inti=0;i

P[i]=newint[G.n()];

for(i=0;i

for(j=0;j

P[i][j]=INFINITY;

for(i=0;i

P[i][i]=0;

Floyd(&G);

file3<<"";

for(inti=0;i

MAP.moveToPos(i);

file3<

}

file3<

for(i=0;i

MAP.moveToPos(i);

file3<

for(j=0;j

if(P[i][j]==INFINITY)

file3<<"-1";

else

file3<

file3<

}

file3.close();

cout<<"所有城市之间的最短距离已写入all-path1,请查看~~"<

MAP.clear();//清楚链表的元素,以防修改信息后重新构图出现重复

cout<<"***************************************************"<

//********************************************************//

//用户修改路径信息

intchange;

cout<<"如果您想要修改城市路径信息,请在map.txt里修改保存"<

cout<<"请务必确保在输入1之前你已经修改了您的信息,否则将会根据原来信息计算最短路径"<

cout<<"修改后的单源路径写入single-path2;所有路径写入all-path2"<

cout<<"输入数字1,可以显示修改后的最短路径信息,输入其它数字退出程序"<

cin>>change;

//*******************************************************//

//下面计算过程和程序代码同上面

if(change==1){

CREATGRAPH();

ofstreamfile4;

file4.open("single-path2.txt");

int*D=newint[G.n()];

for(inti=0;i

D[i]=INFINITY;

stringcity;

cout<

cout<<"请输入您的源点城市名字"<

cin>>city;

ints;

for(inti=0;i

MAP.moveToPos(i);

if(MAP.getCity()==city){

s=MAP.getLable();

break;

}

elseif((i==MAP.length()-1)&&MAP.getCity()!

=city){

cout<<"您所输入的源点不在图中,请检查输入!

"<

cout<<"若想继续查找单源城市最短路径,请重新启动该软件!

"<

system("pause");

}

elsei++;

}

D[s]=0;

//******************************************************//

Dijkstra(&G,D,s);

cout<

file4<

"<

for(intk=0;k

MAP.moveToPos(k);

file4<

";

if(D[k]==INFINITY||D[k]==9999)

file4<<"无路径可达"<

else{

intz=k;

MAP.moveToPos(z);

file4<";

while(pre[z]!

=s){

MAP.moveToPos(pre[z]);

file4<";

z++;

}

file4<

";

file4<

}

}

file4<

file4.close();

//*****************************************************//

ofstreamfile5;

fil

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1