#include <string>
#define INT_MAX 10000
#define n 10
int cost[n][n];
int shortest[n][n];
int path[n][n];
void introduce();
int shortestdistance();
void floyed();
void output(int i,int j);
void main()
{
int i,j,q;
char k;
printf("欢迎来到杭州电子科技大学\n");
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
cost[i][j]=INT_MAX;
cost[1][2]=cost[2][1]=3;
cost[2][3]=cost[3][2]=1;
cost[3][4]=cost[4][3]=2;
cost[4][5]=cost[5][4]=1;
cost[5][6]=cost[6][5]=1;
cost[3][6]=cost[6][3]=2;
cost[1][4]=cost[4][1]=5;
cost[1][7]=cost[7][1]=7;
cost[4][7]=cost[7][4]=1;
cost[7][5]=cost[5][7]=1;
cost[7][8]=cost[8][7]=2;
cost[8][9]=cost[9][8]=1;
cost[5][9]=cost[9][5]=2;
cost[8][5]=cost[5][8]=2;
cost[8][10]=cost[10][8]=1;
cost[1][1]=cost[2][2]=cost[3][3]=cost[4][4]=cost[5][5]=0;
cost[6][6]=cost[7][7]=cost[8][8]=cost[9][9]=cost[10][10]=0;
while(1)
{
printf("欢迎使用校园导游系统!\n");
printf("1.景点信息查询————请按 i \n");
printf("2.景点最短路径查询——请按 s \n");//进入程序后主显示界面
printf("学校景点列表:\n");
printf(" 1:一教\n");
printf(" 2:二教\n");
printf(" 3:三教\n");
printf(" 4:六教\n");
printf(" 5:七教\n");
printf(" 6:八教\n");
printf(" 7:九教\n");
printf(" 8:十教\n");
printf(" 9:十一教\n");
printf(" 10:十二教\n");
printf("请选择服务:");
scanf("\n%c",&k);
switch(k)
{
case 'i':
printf("进入景点信息查询:");
introduce();
break;
case 's':
printf("进入最短路径查询:");
shortestdistance();
break;
default:
printf("输入信息错误!\n请输入字母i或s\n");
break;
}
}
}//主显示界面。
void introduce()//景点查询系统
{
int a;
printf("您想查询哪个景点的详细信息?请输入景点编号:");
scanf("%d",&a);
printf("\n");
switch(a)
{
case 1:
printf("1:一教:通信学院。\n\n");break;
case 2:
printf("2:二教:电子学院和计算机学院。\n\n");break;
case 3:
printf("3:三教:外国语学院。\n\n");break;
case 4:
printf("4:六教:理学院。\n\n");break;
case 5:
printf("5:七教:各种教室。\n\n");break;
case 6:
printf("6:八教:金工实习场地。\n\n");break;
case 7:
printf("7:九教:会计学院,管理学院,经贸学院,文学院。\n\n");break;
case 8:
printf("8:十教:信息工程学院。\n\n");break;
case 9:
printf("9:十一教:各种教室\n\n");break;
case 10:
printf("10:十二教:各种教室\n\n");break;
default:
printf("景点编号输入错误!请输入1->10的数字编号!\n\n"); break;
}
}
int shortestdistance()
{
int i,j;
printf("请输入要查询的两个景点的编号1到10的数字编号并用空格间隔开");
scanf("%d %d",&i,&j);
floyed();
output(i,j);
return 1;
}//最短距离查询界面
void floyed()
{
int i,j,k;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
shortest[i][j]=cost[i][j];
path[i][j]=0;
}//相邻点之间初始距离
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(shortest[i][j]>(shortest[i][k]+shortest[k][j]))
{
shortest[i][j]=shortest[i][k]+shortest[k][j];
path[i][j]=k;
path[j][i]=k;
} //从i到j经K的一条更短路径
}//弗洛伊德算法
void output(int i,int j)//输出
{
int a,b;
a=i;
b=j;
printf("您要查询的两景点间最短路径是:\n\n");
if(shortest[i][j]!=INT_MAX)
{
if(i<j)
{
printf("%d",b);//输出终点
while(path[i][j]!=0)
{
printf("<-%d",path[i][j]);
if(i<j)
j=path[i][j];
else
i=path[j][i];
} //
printf("<-%d",a);
printf("\n\n");
printf("(%d->%d)最短距离是:%d米\n\n",a,b,shortest[a][b]);
}
else
{
printf("%d",a);
while(path[i][j]!=0)
{
printf("->%d",path[i][j]);
if(i<j)
j=path[i][j];
else
i=path[j][i];
}
printf("->%d",b);
printf("\n\n");
printf("(%d->%d)最短距离是:%5d米\n\n",a,b,shortest[a][b]);
}
}
else
printf("输入错误!不存在此路!\n\n");
printf("\n");
}