设计任务
校园导游咨询
问题描述:
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
基本要求:
⑴设计华东交通大学的校园平面图,所含景点不少于10个。以图 中顶点表示校内各景点。
⑵存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
⑶为来访客人提供图中任意景点相关信息的查询。
⑷为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
详细设计思想
1、概要设计
算法 设计:考虑到校园地点数的局限性,此课题完全可以用floy算法或者Dijkstra算法来解决,
我选择的是Dijkstra算法,因为算法执行速度要比floy算法更高效,性能更好,其次就是使用前驱
或者后驱来记录,实现一个路线记录的效果..
Dijkstra算法代码:
#define inf 1000000000
const int maxx = 300;
int temp; /// 地点的个数
int mark[maxx<<1]; /// 标记便于求最短路
int g[maxx][maxx]; /// 校园景点图
int dist[maxx]; /// 单源最短路储存
int pre[maxx]; /// 前驱记录路径
struct Node
{
string name; /// 景点地名
int num; /// 景点代号
string introduce; /// 景点介绍
}school[maxx];
void Dijkstra(int start,int end) /// 求最短路
{
for(int i=1;i<=temp;i++)
{
dist[i]=g[start][i];
pre[i]=start;
mark[i]=0;
}
dist[start]=0;
mark[start]=1;
pre[start]=-1;
for(int i=1;i<=temp;i++)
{
int min=inf;
int u=-1;
for(int j=1;j<=temp;j++)
{
if(mark[j]==0 && dist[j]<min)
{
min=dist[j];
u=j;
}
}
mark[u]=1;
if(u<0) break;
for(int j=1 ; j<=temp ; j++)
{
if(mark[j]==0 && dist[j]>dist[u]+g[u][j])
{
dist[j]=dist[u]+g[u][j];
pre[j]=u;
}
}
}
if(dist[end] < inf) /// 判断最短路是否存在?
{
cout<<"距离: "<<dist[end]<<endl;
cout<<"路径:";
int road[100],ss=0;
road[ss++]=end;
while(pre[end]!=start){ /// 记录路径
road[ss++]=pre[end];
end=pre[end];
}
road[ss++]=start;
cout<<school[road[ss-1]].name;
for(int i=ss - 2 ; i>=0 ;i--) /// 打印路径
{
cout<<"--->"<<school[road[i]].name;
}
cout<<endl;
}
else
cout<<"路径不存在~"<<endl;
cout<<"请按任意键返回!";
system("pause");
}
Floy 算法代码:
#define inf 1000000000
const int maxx = 300;
int temp; /// 地点的个数
int mark[maxx<<1]; /// 标记便于求最短路
int g[maxx][maxx]; /// 校园景点图
int dist[maxx][maxx]; /// 单源最短路储存
int pre[maxx][maxx]; /// 前驱记录路径
struct Node
{
string name; /// 景点地名
int num; /// 景点代号
string introduce; /// 景点介绍
}school[maxx];
void Floy(int start,int end) /// 求最短路
{
for(int i=1;i<=temp;i++){ /// 初始化
for(int j=1;j<=temp;j++){
dist[i][j]=g[i][j];
}
}
int n=temp;
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(dist[i][j] > dist[i][k]+dist[k][j]){
dist[i][j]=dist[i][k]+dist[k][j]; 更新路径
pre[i][j] = pre[i][k]; 记录路径
}
if(dist[start][end]==inf) cout<<"路径不存在~"<<endl;
else {
cout<<"最短路:"<<dist[start][end]<<endl;
cout<<"打印路径: \n"<<start;
while(start!=end){ /// 打印路径
cout<<"-->"<<pre[start][end];
start=pre[start][end];
}
}
cout<<"请按任意键返回!";
system("pause");
}
算法性能分析:
Dijkstra 算法时间复杂度为N的平方,Floy 时间复杂度为N的三次方 ,其中N为问题的规模
floy 算法神牛博客:
http://www.cnblogs.com/twjcnblog/archive/2011/09/07/2170306.html