这是2.0版本能够很好的完成迪杰斯特拉求距离的功能
#include<iostream>
#include<stdlib.h>
#include<cstring>
#include<iomanip>
#define Infinify 65536 //定义无穷大
#include<windows.h>
using namespace std;
int sum=30; //全局变量记录景点总数
int map[100][100],book[100],dis[100]; //建立map二维数组存放带边权邻接矩阵,存储景点间距离
int Point[100][100]; //记录对应点的最小路径的前驱点
int minPath[100][100]; //记录顶点间的最小路径值
//定义结构体 Attraction
struct Attraction{
string name; //景点名称
string des; //景点简介
}p[50];
//将南京理工大学的地图通过带边权邻接矩阵抽象出来
void Load_Map(){ //存入景点名称与简介
//初始化map数组
int i,j;
for(i=1;i<=99;i++){
for(j=1;j<=99;j++){
if(i==j) map[i][j]=0;
else map[i][j]=Infinify;
}
}
//存入景点信息
p[1].name="一号门"; p[1].des="门外就是罗汉巷,好吃多多!";
p[2].name="二号门";p[2].des="也就是北大门,只有它允许外来车辆进出哦!";
p[3].name="三号门(顺丰快递点)";p[3].des="往西一点就是下马坊地铁站,十分方便!";
p[4].name="四号门";p[4].des="外卖柜非常实用!";
p[5].name="五号门";p[5].des="最没有存在感的一个门!";
p[6].name="南大门";p[6].des="非常气派,记得合影留念哦!";
p[7].name="七号门";p[7].des="自从有了外卖柜,妈妈再也不用担心我的外卖被偷啦!";
p[8].name="竹园小区快递点";p[8].des="收京东、天猫快递!";
p[9].name="校医院";p[9].des="好宝宝要注意自己的身体健康哦!";
p[10].name="体育中心";p[10].des="非常大!";
p[11].name="风味美食广场";p[11].des="一楼地方美食一般!二楼的自选餐非常一般!";
p[12].name="第二运动场";p[12].des="体育场的草是真草!";
p[13].name="冶园";p[13].des="这是一处融合自然与人文景观的校园美景!";
p[14].name="和平园(水杉林)";p[14].des="二月兰非常漂亮!要找准时间观赏哦!";
p[15].name="时间广场";p[15].des="有个大日晷!傍晚有很多小朋友哦!";
p[16].name="紫霞湖(艺文馆)";p[16].des="不管是早晨还是傍晚,湖面中都可以看到朝霞与晚霞的倒影!";
p[17].name="学术交流中心";p[17].des="可以听学术讲座,还有话剧可以看哦!";
p[18].name="二道门";p[18].des="经典打卡SPOT!";
p[19].name="二工";p[19].des="有点旧旧的教学楼!";
p[20].name="一工";p[20].des="有点老老的教学楼!";
p[21].name="三工";p[21].des="年纪轻轻就看着一把年纪!";
p[22].name="阳光体育长廊";p[22].des="听说有个很贵的场子哦!";
p[23].name="致远楼";p[23].des="里面都是大拿!";
p[24].name="银杏广场";p[24].des="下雪天打雪仗非常好玩!";
p[25].name="图书馆";p[25].des="有着非常丰富的资源哦!";
p[26].name="逸夫楼";p[26].des="构造非常奇怪!";
p[27].name="四工";p[27].des="大!新!网好!记得早点去抢座!";
p[28].name="明苑美食广场";p[28].des="二楼的麻椒鸡和脆骨肠炒饭非常推荐!";
p[29].name="紫麓宾馆";p[29].des="欢迎光临!";
p[30].name="自动化学院";p[30].des="气派的大楼!";
//存入景点间(步行)距离至map
map[1][2]=655;map[1][29]=331;map[1][15]=456;
map[2][1]=655;map[2][3]=405;map[2][13]=484;map[2][14]=484;map[2][15]=422;
map[3][8]=375;map[3][13]=641;map[3][2]=405;
map[4][12]=405;map[4][6]=380;map[4][28]=209;
map[5][6]=271;map[5][21]=272;map[5][20]=345;map[5][29]=972;map[5][30]=439;
map[6][4]=380;map[6][5]=271;map[6][28]=267;map[6][27]=151;map[6][26]=104;
map[7][10]=153;map[7][11]=357;map[7][18]=345;map[7][12]=304;
map[8][3]=375;map[8][9]=114;
map[9][8]=114;map[9][10]=192;
map[10][9]=192;map[10][16]=259;map[10][7]=153;
map[11][7]=357;map[11][12]=10;map[11][22]=395;
map[12][7]=304;map[12][11]=10;map[12][4]=405;
map[13][3]=641;map[13][2]=484;map[13][14]=186;map[13][16]=175;
map[14][2]=484;map[14][13]=186;map[14][17]=337;
map[15][1]=456;map[15][17]=117;map[15][29]=155;map[15][2]=422;
map[16][10]=259;map[16][13]=175;map[16][17]=162;map[16][18]=228;
map[17][14]=337;map[17][15]=117;map[17][29]=125;map[17][16]=162;map[17][18]=93;
map[18][7]=345;map[18][16]=228;map[18][17]=93;map[18][19]=141;map[18][23]=199;
map[19][18]=141;map[19][23]=60;map[19][20]=338;
map[20][19]=338;map[20][21]=158;map[20][5]=345;map[20][30]=591;
map[21][25]=248;map[21][20]=158;map[21][5]=272;
map[22][23]=179;map[22][24]=100;map[22][27]=332;map[22][11]=395;
map[23][18]=199;map[23][19]=60;map[23][24]=126;map[23][22]=179;
map[24][23]=126;map[24][22]=100;map[24][25]=134;
map[25][21]=248;map[25][24]=134;map[25][26]=131;
map[26][25]=131;map[26][27]=20;map[26][6]=104;
map[27][22]=332;map[27][28]=211;map[27][6]=151;map[27][26]=20;
map[28][4]=209;map[28][27]=211;map[28][6]=267;
map[29][1]=331;map[29][15]=155;map[29][17]=125;map[29][5]=972;
map[30][20]=591;map[30][5]=439;
return;
}
//输出邻接矩阵
void Print_Matrix(){
int i,j;
for(i=1;i<=sum;i++){
for(j=1;j<=sum;j++){
if(map[i][j]==Infinify) map[i][j]=-1;
cout<<setw(3)<<map[i][j]<<" ";
if(j==sum) cout<<endl;
}
}
return;
}
//景点编号及名称指引界面
void Load_List(){
system("cls");
cout<<" ************************************************************************* "<<endl;
cout<<" ** 欢迎来到南京理工大学! ** "<<endl;
cout<<" ** 以下为景点编号及名称 ** "<<endl;
cout<<" ************************************************************************* "<<endl;
cout<<" ** (1)一号门 (2)二号门 (3)三号门 ** "<<endl;
cout<<" ** (4)四号门 (5)五号门 (6)南大门 ** "<<endl;
cout<<" ** (7)七号门 (8)竹园小区快递点 (9)校医院 ** "<<endl;
cout<<" ** (10)体育中心 (11)风味美食广场 (12)第二运动场 ** "<<endl;
cout<<" ** (13)冶园 (14)和平园(水杉林)(15)时间广场 ** "<<endl;
cout<<" ** (16)紫霞湖(艺文馆) (17)学术交流中心 (18)二道门 ** "<<endl;
cout<<" ** (19)二工 (20)一工 (21)三工 ** "<<endl;
cout<<" ** (22)阳光体育长廊 (23)致远楼 (24)银杏广场 ** "<<endl;
cout<<" ** (25)图书馆 (26)逸夫楼 (27)四工 ** "<<endl;
cout<<" ** (28)明苑美食广场 (29)紫麓宾馆 (30)自动化院 ** "<<endl;
cout<<" ************************************************************************* "<<endl;
return;
}
void Dijkstra(int v0,int s) //迪杰斯特拉求最短路径,并输出路线
{
int min,i,j,u,v;
int q[110],l[110];
memset(q,-1,sizeof(q));
memset(l,0,sizeof(l));
memset(book,0,sizeof(book));
for(i=1;i<=30;i++)
{
dis[i]=map[v0][i];
if(dis[i]< Infinify) //v0能直接到达,即上一站点为v0
q[i]=v0;
}
book[v0]=1;
for(i=1;i<30;i++)
{
min= Infinify;
for(j=1;j<=30;j++) //每次找出距离v0最近点
{
if(book[j]==0&&dis[j]<min)
{
min=dis[j];
u=j;
}
}
book[u]=1; //标记该点
for(v=1;v<=30;v++)
{
if(book[v]==0&&dis[v]>dis[u]+map[u][v]) //通过最近点更新其他边
{
q[v]=u; //存储更新的边,即为路线
dis[v]=dis[u]+map[u][v];
}
}
}
v=s;
i=1;
while(q[v]!=v0) //将路线存入栈中,正序输出
{
l[i++]=q[v];
v=q[v];
}
u=i-1;
cout<<"路线为:"<<endl;
cout<<p[v0].name<<"--->";
for(i=u;i>=1;i--)
cout<<p[l[i]].name<<"--->";
cout<<p[s].name<<endl;
cout<<"最短路径长度为:"<<dis[s]<<"米"<<endl;
}
void minest()
{
Load_Map();
Load_List();
int v1,v2;
cout << "编号如上图,请输入您要查询的两个景点的编号:"<<endl;
cout <<"起始景点:";
cin>>v1;
cout <<"终止景点:";
cin>>v2;
Dijkstra(v1,v2);
};
//起始页
void start()
{
int i;
for(i=0; i<5; i++)
cout<<endl;
cout<<" *********************************************"<<endl;
cout<<" ** **"<<endl;
cout<<" ** 欢迎使用南京理工大学校园导航系统 **"<<endl;
cout<<" ** **"<<endl;
cout<<" *********************************************"<<endl;
for(i=0; i<5; i++)
cout<<endl;
cout<<"按回车键继续......";
getchar();
}
//菜单页
void meau()
{ cout << "*****************************************************************************************************************" << endl;
cout << "*** 请选择你需要实现的功能~ ***"<<endl;
cout << "*****************************************************************************************************************" << endl;
cout << "*** ***" << endl;
cout << "*** 输入1 景点信息查询 ***" << endl;
cout << "*** 输入2 增加您对于景点的备注 ***" << endl;
cout << "*** 输入3 查询两景点间最短距离 ***" << endl;
cout << "*** 输入4 查询两景点间采用不同出行方式的最短时长 ***" << endl;
cout << "*** 输入5 查询多个景点间的最佳路径 ***" << endl;
cout << "*** 输入6 增加景点和道路(该功能为管理员功能) ***" << endl;
cout << "*** 输入0 退出本系统 ***" << endl;
cout << "*** ***" << endl;
cout << "*****************************************************************************************************************" << endl;
}
int main() {
MessageBox(NULL,"确认进入南京理工大学校园导航系统?!","欢迎使用南理工校园导航系统!",MB_OK);
system("color F9");
start();
system("cls");
meau();
cout << "请输入您要执行功能的编号:(请输入数字!)" ;
int c;
cin>>c;
if(c<0||c>5)
{
cout <<"输入不符合要求,请重新输入!"<<endl;
}
switch (c)
{
case 3: //查询两景点间最短距离
minest();
break;
}
return 0; // 返回退出
}