城市之间最短路径管理软件.docx
《城市之间最短路径管理软件.docx》由会员分享,可在线阅读,更多相关《城市之间最短路径管理软件.docx(22页珍藏版)》请在冰豆网上搜索。
![城市之间最短路径管理软件.docx](https://file1.bdocx.com/fileroot1/2023-1/12/fa1e2b31-3141-4397-bbc2-52b38c6c2884/fa1e2b31-3141-4397-bbc2-52b38c6c28841.gif)
城市之间最短路径管理软件
重庆大学实验报告
实验题目:
城市之间最短路径管理软件
学院:
计算机学院
专业班级:
年级:
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;iMap[i]=newint[n];
for(inti=0;ifor(intj=0;jMap[i][j]=0;
//将地图中的城市及其标号存入链表MAP中
for(inti=0;icharstr1;
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;icharstr;
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;lab1for(intlab2=0;lab2if(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;lab1for(intlab2=0;lab2if(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;iMAP.moveToPos(i);
cout<}
int*D=newint[G.n()];
for(inti=0;iD[i]=INFINITY;
//*********************************************//
stringcity;
cout<cout<<"请输入您的源点城市名字"<cin>>city;
ints;
for(inti=0;iMAP.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;kMAP.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;iP[i]=newint[G.n()];
for(i=0;ifor(j=0;jP[i][j]=INFINITY;
for(i=0;iP[i][i]=0;
Floyd(&G);
file3<<"";
for(inti=0;iMAP.moveToPos(i);
file3<}
file3<for(i=0;iMAP.moveToPos(i);
file3<for(j=0;jif(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;iD[i]=INFINITY;
stringcity;
cout<cout<<"请输入您的源点城市名字"<cin>>city;
ints;
for(inti=0;iMAP.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;kMAP.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