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

设计任务

                            校园导游咨询 

问题描述:

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

基本要求:

⑴设计华东交通大学的校园平面图,所含景点不少于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




  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
华东交通大学数据结构829bbs是一个专门讨论和分享数据结构相关知识与经验的在线论坛。该论坛由华东交通大学的学生和教师自发组织,旨在促进学习者之间的交流与合作,提供一个讨论数据结构问题、解决困惑和互相学习的平台。 论坛的名字"829bbs"代表的是华东交通大学数据结构课程的课程编号,显示了论坛的主题和定位。在论坛的主页上,用户可以看到各种不同的板块,如数据结构基础、算法分析与设计、实践项目等。每个板块上都有相应的帖子,用户可以在其中发布问题、分享经验、发表意见等。 作为一个学习数据结构的学生,加入829bbs论坛可以带来许多好处。首先,论坛上有许多经验丰富的学长学姐和教师,他们可以为我们提供宝贵的指导和建议。其次,在论坛上我们可以和其他学生进行互动,共同解决问题、讨论课程内容、分享学习资源等。通过参与讨论和分享,我们有机会拓宽自己的思路,加深对数据结构的理解。 829bbs论坛还设置了一些有趣的活动,如编程竞赛、知识测试等,以增加学生们的积极性和参与度。除此之外,还可以在论坛上了解到一些就业信息、实习机会等,对我们的职业生涯和发展也带来积极影响。 总之,华东交通大学数据结构829bbs是一个与数据结构相关的在线社区,为学生提供了一个交流、学习和分享的平台,对于我们提高数据结构知识和能力非常有帮助。加入该论坛不仅可以在学业上获得帮助,还可以结识志同道合的朋友,拓宽自己的视野和学术圈子。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值