图论---最短路(记录路径)

来源:互联网 发布:软件使用合同 编辑:程序博客网 时间:2024/06/17 03:45

设计任务

                            校园导游咨询 

问题描述:

设计一个校园导游程序,为来访的客人提供各种信息查询服务。

基本要求:

⑴设计华东交通大学的校园平面图,所含景点不少于10个。以图         中顶点表示校内各景点。

⑵存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。

⑶为来访客人提供图中任意景点相关信息的查询。

⑷为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。

                详细设计思想

1、概要设计

 

算法 设计:考虑到校园地点数的局限性,此课题完全可以用floy算法或者Dijkstra算法来解决,

我选择的是Dijkstra算法,因为算法执行速度要比floy算法更高效,性能更好,其次就是使用前驱

或者后驱来记录,实现一个路线记录的效果..



//// Dijkstra算法代码:#define inf 1000000000const 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 1000000000const 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




原创粉丝点击