G.arcs[i][j]=Max;
}
G.arcs[1][2]=G.arcs[2][1]=200;
G.arcs[1][3]=G.arcs[3][1]=210;
G.arcs[1][5]=G.arcs[5][1]=521;
G.arcs[2][4]=G.arcs[4][2]=299;
G.arcs[2][5]=G.arcs[5][2]=450;
G.arcs[2][3]=G.arcs[3][2]=869;
G.arcs[3][5]=G.arcs[5][3]=620;
G.arcs[3][8]=G.arcs[8][3]=756;
G.arcs[4][5]=G.arcs[5][4]=355;
G.arcs[4][6]=G.arcs[6][4]=221;
G.arcs[5][7]=G.arcs[7][5]=225;
G.arcs[5][8]=G.arcs[8][5]=900;
G.arcs[6][7]=G.arcs[7][6]=280;
G.arcs[6][9]=G.arcs[9][6]=241;
G.arcs[7][8]=G.arcs[8][7]=440;
G.arcs[7][10]=G.arcs[10][7]=350;
G.arcs[8][10]=G.arcs[10][8]=570;
G.arcs[9][10]=G.arcs[10][9]=1300;
G.arcs[9][11]=G.arcs[11][9]=998;
G.arcs[9][12]=G.arcs[12][9]=1200;
G.arcs[10][11]=G.arcs[11][10]=639;
G.arcs[10][12]=G.arcs[12][10]=805;
G.arcs[11][12]=G.arcs[12][11]=283;
G.arcs[12][13]=G.arcs[13][12]=296;
}
voidMap()//地图展示函数
{
printf("\t************************江南大学大学地图导航系统*******************\n");
printf("━━━━━━━━━━━━━━━1江南大学北大门━━━━━━━━━━\n");
printf("┃┃┃\n");
printf("┃┃┃\n");
printf("2第一食堂━━━━━━━━━━━━━━━━━━━━━━━━━3江南大学东偏门\n");
printf("┃┃┃\n");
printf("┃┃┃\n");
printf("4设计学院━━━━━━━━━━━━5体育中心━━━━━━━━━━━━┃\n");
printf("┃┃┃\n");
printf("┃┃┃\n");
printf("┃┃┃\n");
printf("6物联网工程学院━━━━━━━━━7图书馆━━━━━━━━━8江南大学东门\n");
printf("┃┃┃\n");
printf("┃┃┃\n");
printf("┃┃┃\n");
printf("9国家重点实验室10第二教学楼━━━━━━━━━━┃\n");
printf("┃┃┃\n");
printf("┃┃┃\n");
printf("━━━━━━━━━━━━━━━━┃━━━━━━━━━━┃\n");
printf("┃┃\n");
printf("┃━━━11第四食堂\n");
printf("┃\n");
printf("13臻善楼━━━━━━━━━━━━━12江南大学南门\n");
}
voidInfo()//资料介绍函数
{
printf("1江南大学校北大门:
这是江南大学最有名的大门,是一座充满历史感的高大的牌坊,正上面写着“江南大学”四个大字,背面写着“江南第一学府”六个字\n");
printf("2江南大学第一食堂\n");
printf("3江南大学东偏门:
\n");
printf("4设计学院:
\n");
printf("5体育中心:
\n");
printf("6物联网工程学院:
\n");
printf("7图书馆:
高达15层的雄伟的图书馆\n");
printf("8江南大学东门:
\n");
printf("9国家重点实验室:
\n");
printf("10第二教学楼:
\n");
printf("11第四食堂:
\n");
printf("13臻善楼:
\n");
printf("12江南大学南门:
\n");
}
voidShortestPath(intnum)//迪杰斯特拉算法最短路径函数num为入口点的编号
{
intv,w,i,t;//i、w和v为计数变量
intfinal[NUM];
intmin;
for(v=1;v{
final[v]=0;//假设从顶点num到顶点v没有最短路径
D[v]=G.arcs[num][v];//将与之相关的权值放入D中存放
for(w=1;wP[v][w]=0;
if(D[v]<32767)//存在路径
{
P[v][num]=1;//存在标志置为一
P[v][v]=1;//自身到自身
}
}
D[num]=0;
final[num]=1;//初始化num顶点属于S集合
//开始主循环,每一次求得num到某个顶点的最短路径,并将其加入到S集合
for(i=1;i{
min=Max;//当前所知离顶点num的最近距离
for(w=1;wif(!
final[w])//w顶点在v-s中
if(D[w]{
v=w;
min=D[w];
}//更新当前最短路径极其距离
final[v]=1;//离num顶点更近的v加入到s集合
for(w=1;wif(!
final[w]&&((min+G.arcs[v][w]){
D[w]=min+G.arcs[v][w];
for(t=0;tP[w][t]=P[v][t];
P[w][w]=1;
}
}
}
charMenu()//应用主界面显示函数
{
charc;
intflag;
do{
system("cls");
flag=1;
Map();
printf("\t\t欢迎使用江南大学导航图系统\n");
printf("\t\t1.查询地点之间最短路径\n");
printf("\t\t2.江南大学景点介绍\n");
printf("\t\te.退出\n");
printf("\t\t\t请输入您的选择:
");
scanf("%c",&c);
if(c=='1'||c=='2'||c=='e')//如果输入为1,2,E中的一个,则返回C
flag=0;
}
while(flag);
returnc;
}
voidDisplay(intsight1,intsight2)//最短距离显示函数
{
inta,b,c,d,q=0;
a=sight2;
if(a!
=sight1)
{
printf("\n\t从%s到%s的最短路径是",G.vex[sight1].sight,G.vex[sight2].sight);
printf("\t(最短距离为%d.m)\n\n\t",D[a]);
printf("\t%s",G.vex[sight1].sight);
d=sight1;
for(c=0;c{
P[a][sight1]=0;
for(b=0;b{
if(G.arcs[d][b]{
printf("-->%s",G.vex[b].sight);
q=q+1;
P[a][b]=0;
d=b;
if(q%8==0)printf("\n");
}
}
}
}
}
voidmain()//主界面最短路线查询显示函数
{
intv0,v1;
chare;
charck;
CreateMGraph(NUM);
do
{
system("cls");
ck=Menu();
switch(ck)
{
case'1':
gate:
system("cls");
Map();
do
{
printf("\n\n\t\t\t请选择出发地序号(1~13):
");
scanf("%d",&v0);
if(v0<1||v0>13)
printf("\n\n\t\t\t\t输入错误!
\n");
}while(v0<1||v0>13);
do
{
printf("\t\t\t请选择目的地序号(1~13):
");
scanf("%d",&v1);
if(v1<1||v1>13||v1==v0)
printf("\n\n\t\t\t\t输入错误!
\n");
}while(v1<1||v1>13||v1==v0);
ShortestPath(v0);
Display(v0,v1);
printf("\n\n\t\t\t\t按回车键继续,按e退回首页\n");
getchar();
scanf("%c",&e);
if(e=='e')
break;
gotogate;
case'2':
system("cls");
Info();
printf("\n\n\t\t\t\t按回车键返回首页...\n");
getchar();
getchar();
break;
};
}
while(ck!
='e');
}
四、程序调试及运行结果贴图
5、总结
通过这次设计,是我得以更好的掌握C语言的编程,对一些算法思想和实现方法有了更深的了解。
在设计中,出现了一系列的问题,好多次都差点坚持不下去,但最终还是完成了!
当程序编译并且运行成功的那一刻,真的是非常的激动。
感谢老师平时上课时的教导,可以使我更好的完成这次作业