公园导游系统(求任意两点最短路径,Floyd算法,DFS)

本程序是本人大二课程设计自己写滴,希望对您有帮助!!

课题设计简要任务:

  1. 构建公园无向图,领接矩阵或邻接表储存;
  2. 要求求任意两个景点的最短路径;
  3. 列出入口到出口的路径(路径条数有上限)。
  4. 要求用文本读入的方式读取数据

目录

一、景点储存与读入

二、DFS

三、Floyd

四、测试

五、代码


一、景点储存与读入

本人用的是邻接表的方式储存数据

struct Head_Node //头节点,纵向
{
	string name;
	struct Node* First; //指向的第一个Node 
	Head_Node()
	{
		name = "";
		First = NULL;
	}
};
struct Node //横向节点
{
	int index;//对应的下标(Head_Node中)
	struct Node* next;  
	double weight;//米
	Node()
	{
		index = 0;
		next = NULL;
		weight = int(1<<30);
	}
};

接下来是Park_guide类的建立

class Park_guide //有权无向图
{
private:
	vector<Head_Node> Net;//总网,纵向数组
	static int Max_Path;
	static int Path_Num;//路径数
	int Spot_Num;//景点数
	int Side_Num;//边数
	int Min_Path[Max_spot][Max_spot];//最短路径的导引数组,用于查任意两点最短路径
	double Map[Max_spot][Max_spot]; //对应的邻接矩阵
	//double Min_line[100][100];
public:
	Park_guide();//初始化地图
	~Park_guide();
	void Fp_in();//读入文件的函数
	int Find(vector<Head_Node> &x, string y);//返回景点y 在Net中的位置(纵向的坐标)
	void Inout_ways();//入口和出口的路径
	void Inout_Dfs(int temp, int In, int Out, int *arr, int *path);
	void Print_line(int In, int Out, int* path);//打印入口出口路线,最大 Max_Path 条
	double Weight(int x, int y);//返回以x - y为边的权值
	void Per_Min_line();
	void Tran_array();
	void Two_Mi_line(string de1, string de2);
	
	int Re_Num() { return Max_Path; }//返回最大路径数
};

上图可以方便理解

接下来是文件的读入

首先文件的读入有格式,如下:

n=7
入口 景点1 景点2 景点3 景点4 景点5 出口
v=10
入口 景点1 5
入口 景点3 10
景点1 景点3 8
景点1 景点2 7
景点2 景点5 7
景点5 景点3 6
景点5 景点4 4
景点4 出口 4
景点3 出口 20
景点2 景点4 5 

文件名为Test.txt;

n为景点数(包含入口和出口);

v为边数;

第二行要入口为第一个,出口为最后一个;

之间以空格间隔。

下面是函数实现

void Park_guide::Fp_in()
{
	ifstream ifs("Test.txt");//定义文件输入流
	(ifs).seekg(0);//定位到文件开头
	char ch=' ';
	string line="";//用于跳行
	while (1)
	{
		ifs.get(ch);
		if (ch == 'n') break;
		getline(ifs, line);
	}
	ifs.get(ch);//把等号忽略掉,从等号之后开始读
	int n=0;
	ifs >> n; //ifs可以与cin一样输入
	Spot_Num = n;
	//存景点
	for (int i = 0; i < n; ++i)
	{
		Head_Node* s = new Head_Node();
		ifs >> s->name;
		Net.push_back(*s);
	}
	ifs.get(ch);//把回车吃掉
	ch = ' ';
	line = ' ';
	while (1)
	{
		ifs.get(ch);
		if (ch == 'v') break;
		getline(ifs, line);
	}
	int v = 0;
	ifs.get(ch);
	ifs >> v;
	Side_Num = v;

	//初始化地图
	double w;
	string s1, s2;
	for (int i = 0; i < Side_Num; ++i)
	{
		Node* x = new Node();
		Node* y = new Node();
		//边s1,s2对应(x -w- y)
		ifs >> s1 >> s2 >> w;
		//x为始点,y为末点, 头插法
		y->index = Find(Net, s2);
		y->weight = w;
		y->next = Net[Find(Net, s1)].First;
		Net[Find(Net, s1)].First = y;
		//y为始点
V2.31版本更新说明 1.此次更新的最大亮点是更换最新整体网站主题,较之以前更加细腻养眼! 2.对客户提出的相关BUG进行了修正及优化。 3.网站首页重新排版,更加细化美观。 4.分类页及子页面一并修改,符合首页风格。 5.对部分垃圾网站进行清理! 6.页面代码级后台功能优化! 修改和注意事项: 1.购买后请务必修改一下后台的地址 2.后台的用户名和密码建议10位以上,数字、字母和符号结合 3.修改主页和分类页面等,都是在后台直接修改相应的模板。然后生成一下相应的模版就可以看到。 4.其它没有在后台集成模板的,可以直接修改相应的文件就行。 安全事项: 1,把程序的数据库名进行更改,数据库在data1文件夹内,名称是aqdh.asa(在这个基础上加上一些数字或者字母),改完数据库名后,需要改conn.asp和admin/conn.asp里面对应的数据库名! 2,防止被注入查询的请到后台管理将用户名和密码改成字母加数字8位以上,密码如带"."的更好,这样不易被破解! 3,不要乱安装除本站程序以外其它的程序,因为不能保证他的程序是否安全! 4.默认的安全码更改路径admin文件夹里的psd.asp这个文件,把"123456"这个改成你想要的后台安全验证码。目前默认的后台安全码是123456 ☆安装使用方法☆ 1.解压本软件包,上传到支持ASP的服务器上。 2.数据库文件aqdh.asa,已经做了防下载处理。 3.后台登录地址在admin/index.asp(建议修改一下后台的名称),默认管理员账号:d59258449,密码:twtpfdn。为了更安全,后台密码请设置为带有“.”的密码。 4.进入后台根据提示设置你网站的基本信息。 5.生成全站及分类一次。 6.为了安全起见,请在后台将管理员帐号和密码全部修改成你自己的. ☆系统前台简介☆ 1.申请加入免收录网站友情链接网的网站按最后点进的时间排序首页和分类显示链接, 分类以昨日点入时间为准,每晚十二点后生成静态。 2.每来访一个IP,就会自动排到第一,当天来路不同次数,显示颜色也不同:有1次即显示,10次即套蓝色,30次即套红色加粗 3.首页白天3分钟,晚上5分钟自动更新一次,全站24小时手动更新一次。 4.站内搜索功能。 5.网址库中分离出的【名站导航】【实用工具】【友情链接】 ☆系统后台功能☆ 1.设置网站的基本信息。 2.管理员帐号/密码更改。 3.添加删除分类。 4.分类可修改可设置首页是否显示。 5.酷站可设置首页是否显示。 6.添加删除修改网址内容,是否推荐,是否审核。 7.可从网址库中分离出【名站导航】【实用工具】【友情链接】 8.【名站导航】【实用工具】可由快速通道添加。 9.【友情链接】从网址列表中设置。 10.站内搜索功能。 11.生成htm分类页面,生成htm主页及其它页面。 12.可修改主页,分类及其它页面模板。 13.具有数据库【备份】【压缩】【恢复】功能。 14.后台广告位标注
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值