数据结构课设---基于弗洛伊德算法的城市旅游交通路线推荐系统

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <cstdio>
#include <string>
#include <stack>
#include <deque>
#include<numeric>
#include<vector>
using namespace std;
#define MAX 0x3f3f3f
#define PP 999999
stack<int> S;
int dis[16], vis[16];
int dist[20][20];
int path[20], path1[20][20];
const int MAXV = 1001, INF = 1000001;
bool vest[MAXV];
int nex[MAXV], d[MAXV][MAXV];
int N, M, st, ed, cnt = 0;
struct site //省会信息
{
	int number; //编号
	char name[20];//省会名称
	char infor[100];//景点
};
struct maps //省会交通咨询的图
{
	int point; //地点
	int side; //边
	site s[20];
	int edge[20][20];
	int edge_car[20][20];
} m;
void DFS(int i)
{
	vest[i] = true;
	if (i == ed)
	{
		cnt++;
		printf("第%d条路径如下", cnt);
		int k = st;
		while (k != ed)
		{
			printf("%d->", k);
			k = nex[k];
		}
		printf("%d\n", k);
		return;
	}

	for (int j = 1; j <= m.point; j++)
	{
		if (vest[j] == false && m.edge[i][j] != MAX)
		{
			nex[i] = j;//对于路径0->1->3: nex[0]=1;nex[1]=3;
			DFS(j);
			vest[j] = false;
		}
	}
}
void DFS1(int i)
{
	vest[i] = true;
	if (i == ed)
	{
		cnt++;
		printf("第%d条路径如下", cnt);
		int k = st;
		while (k != ed)
		{
			printf("%d->", k);
			k = nex[k];
		}
		printf("%d\n", k);
		return;
	}

	for (int j = 1; j <= m.point; j++)
	{
		if (vest[j] == false && m.edge_car[i][j] != MAX)
		{
			nex[i] = j;//对于路径0->1->3: nex[0]=1;nex[1]=3;
			DFS1(j);
			vest[j] = false;
		}
	}
}
void Search()
{
	int i, n;
	printf("省会城市有:\n");
	printf("****************\n");
	for (i = 1; i <= 14; i++)
	{
		printf("*******%d:%s\n", m.s[i].number, m.s[i].name);
	}
	printf("****************\n");
	while (1)
	{
		printf("请输入你想要查询的省会编号(输入0退出!):");
		scanf("%d", &n);
		getchar();
		if (n == 0)
		{
			break;
		}
		else if (n < 1 || n>14)
		{
			printf("输入有误,请重新输入!!!\n\n");
			continue;
		}
		else
		{
			printf("%d:%s----->", m.s[n].number, m.s[n].name);
			printf("%s\n\n", m.s[n].infor);
		}
	}
	return;
}
void make_site()
{
	int i;
	for (i = 1; i <= m.point; i++)
		m.s[i].number = i;
	strcpy(m.s[1].name, "北京");
	strcpy(m.s[1].infor, "有名的景点有:天安门");
	strcpy(m.s[2].name, "天津");
	strcpy(m.s[2].infor, "有名的景点有:天津之眼");
	strcpy(m.s[3].name, "上海");
	strcpy(m.s[3].infor, "有名的景点有:迪士尼乐园");
	strcpy(m.s[4].name, "南京");
	strcpy(m.s[4].infor, "有名的景点有:夫子庙");
	strcpy(m.s[5].name, "西安");
	strcpy(m.s[5].infor, "有名的景点有:兵马俑");
	strcpy(m.s[6].name, "武汉");
	strcpy(m.s[6].infor, "有名的景点有:黄鹤楼");
	strcpy(m.s[7].name, "长沙");
	strcpy(m.s[7].infor, "有名的景点有:橘子洲头");
	strcpy(m.s[8].name, "贵阳");
	strcpy(m.s[8].infor, "有名的景点有:梵净山");
	strcpy(m.s[9].name, "成都");
	strcpy(m.s[9].infor, "有名的景点有:大熊猫繁殖基地");
	strcpy(m.s[10].name, "昆明");
	strcpy(m.s[10].infor, "有名的景点有:滇池");
	strcpy(m.s[11].name, "合肥");
	strcpy(m.s[11].infor, "有名的景点有:三河古镇");
	strcpy(m.s[12].name, "乌鲁木齐");
	strcpy(m.s[12].infor, "有名的景点有:天山天池");
	strcpy(m.s[13].name, "呼和浩特");
	strcpy(m.s[13].infor, "有名的景点有:太伟滑雪场");
	strcpy(m.s[14].name, "哈尔滨");
	strcpy(m.s[14].infor, "有名的景点有:哈尔滨极地馆");
}
void make_map()
{
	int i, j;
	m.point = 14;
	m.side = 17;
	for (i = 0; i <= m.point; i++)
		for (j = 0; j <= m.point; j++)
		{
			m.edge[i][j] = MAX;
			m.edge_car[i][j] = MAX;
		}
	memset(dis, MAX, sizeof(dis));
	memset(vis, 0, sizeof(vis));
	fill(vest, vest + MAXV, false);
	fill(d[0], d[0] + MAXV * MAXV, INF);

	d[0][1] = m.edge[1][2] = m.edge[2][1] = 133;
	d[1][2] = m.edge[1][5] = m.edge[5][1] = 1071;
	d[2][3] = m.edge[1][9] = m.edge[9][1] = 1792;
	d[2][4] = m.edge[1][13] = m.edge[13][1] = 481;
	d[4][5] = m.edge[1][14] = m.edge[14][1] = 1240;
	d[4][7] = m.edge[2][4] = m.edge[4][2] = 892;
	d[4][8] = m.edge[4][3] = m.edge[3][4] = 299;
	d[5][9] = m.edge[6][10] = m.edge[10][6] = 40;
	d[7][8] = m.edge[8][9] = m.edge[9][8] = 50;
	d[8][9] = m.edge[9][10] = m.edge[10][9] = 60;
	d[3][6] = m.edge[4][7] = m.edge[7][4] = 60;
	d[6][9] = m.edge[7][10] = m.edge[10][7] = 55;
	d[6][10] = m.edge[7][11] = m.edge[11][7] = 60;
	d[6][13] = m.edge[7][14] = m.edge[14][7] = 70;
	d[9][12] = m.edge[10][13] = m.edge[13][10] = 80;
	d[11][12] = m.edge[12][13] = m.edge[13][12] = 50;
	d[12][13] = m.edge[13][14] = m.edge[14][13] = 50;
	d[0][2] = m.edge_car[2][4] = m.edge_car[4][2] = 180;
	m.edge_car[4][11] = m.edge_car[11][4] = 160;
	m.edge_car[11][14] = m.edge_car[14][11] = 40;
	m.edge_car[14][12] = m.edge_car[12][14] = 120;
	m.edge_car[12][8] = m.edge_car[8][12] = 100;

}
void DIS(int a, int b, int c)//计算dis数组
{
	memset(path, 0, sizeof(path));
	int i, j, pos = 1, minn;
	memset(vis, 0, sizeof(vis));
	for (i = 1; i <= m.side; i++)
	{
		if (a == 1)
			dis[i] = m.edge[b][i];
		if (a == 2)
			dis[i] = m.edge_car[b][i];
	}
	vis[b] = 1;
	dis[b] = 0;
	for (i = 1; i <= m.point; i++)
	{
		minn = MAX;
		for (j = 1; j <= m.point; j++)
		{
			if (vis[j] == 0 && minn > dis[j])
			{
				minn = dis[j];
				pos = j;
			}
		}
		vis[pos] = 1;
		for (j = 1; j <= 14; j++)
		{
			if (a == 1)
			{
				if (vis[j] == 0 && dis[j] > dis[pos] + m.edge[pos][j])
				{
					dis[j] = dis[pos] + m.edge[pos][j];
					path[j] = pos;
				}
			}
			if (a == 2)
			{
				if (vis[j] == 0 && dis[j] > dis[pos] + m.edge_car[pos][j])
				{
					dis[j] = dis[pos] + m.edge_car[pos][j];
					path[j] = pos;
				}
			}
		}
	}
}
void dijstra(int b, int a, int c)
{
	DIS(a, b, c);
	int x = c;
	while (!S.empty())
		S.pop();
	while (1)
	{
		if (x == 0)
			break;
		S.push(x);
		x = path[x];
	}
	S.push(b);
	if (dis[c] >= 100000)
		printf("没有直达的路,请选择步行。\n");
	else
	{
		printf("从%d到%d的最短路径为:", b, c);
		while (!S.empty())
		{
			if (S.size() > 1)
				cout << S.top() << "->";
			else
				cout << S.top();
			S.pop();
		}
		printf("其最短距离为:%d", dis[c]);
	}

}
void mshort()
{
	int a, b, c;
	printf("=====出行方式=====\n");
	printf("1.步行\n");
	printf("2.驾车\n");
	printf("==================\n");
	printf("选择出行方式\n");
	scanf("%d", &a);
	printf("输入起点\n");
	scanf("%d", &b);
	printf("输入终点\n");
	scanf("%d", &c);
	if ((b <= 0 && b >= 16) || (c <= 0 && c >= 16))
	{
		printf("输入错误");
	}
	else
		dijstra(b, a, c);

}
void ashort()
{
	int a, b, c;
	printf("=====出行方式=====\n");
	printf("1.步行\n");
	printf("2.驾车\n");
	printf("==================\n");
	printf("选择出行方式\n");
	scanf("%d", &a);
	printf("输入起点\n");
	scanf("%d", &b);
	printf("输入终点\n");
	scanf("%d", &c);
	if ((b <= 0 && b >= 16) || (c <= 0 && c >= 16))
	{
		printf("输入错误");
	}
	else
	{
		st = b;
		ed = c;
		if (a == 1)
			DFS(st);
		if (a == 2)
			DFS1(st);
	}
}
int menu()//菜单
{
	int n;
	printf("\n");
	printf("       *****************欢迎使用省会交通地图咨询系统***************\n\n");
	printf("       *                  1.省会交通信息查询                 *\n");
	printf("       *                  2.两个省会之间最短路查询             *\n");
	printf("       *                  3.两景点间所有路径查询             *\n");
	printf("       *                  4.多景点间访问路线查询             *\n");
	printf("       *                  5.退出系统                         *\n");
	printf("       *******************************************************\n");
	printf("输入指令:\n");
	scanf("%d", &n);
	getchar();
	return n;
}
void maps()//省会交通咨询图
{

	printf("                                                                                                              \n");
	printf("                                                                                                              \n");
	printf("                                             ****省会交通咨询图****                                           \n");
	printf("                                                                                  (14)哈尔滨                  \n");
	printf("                                                                                      *                       \n");
	printf("                                                                                    *                         \n");
	printf("                                         (13)呼和浩特                            *                            \n");
	printf("                                            *      *                           *                              \n");
	printf("                                         *           *                       *                                \n");
	printf("                                      *               *                   *                                   \n");
	printf("                                   *                   *                *                                     \n");
	printf("                                 *                      *            *                                        \n");
	printf("                               *                         *         *                                          \n");
	printf("                             *                            * (1) *                                             \n");
	printf("                           *                              *北京                                               \n");
	printf("                         *                             *    * *                                               \n");
	printf("                     (12)乌鲁木齐                   *      *   *                                              \n");
	printf("                          *                      *        *     *                                             \n");
	printf("                           *                  *          *        *                                           \n");
	printf("                            *               *           *          *                                          \n");
	printf("                             *           *             *             *                                        \n");
	printf("                              *      *                *               *                                       \n");
	printf("                          (9)成都 *                  *                 *                                      \n");
	printf("                              *                   (5)西安           (2) 天津                                  \n");
	printf("                            *                      *    *                *                                    \n");
	printf("                           *                      *       *              *                                    \n");
	printf("                         *                      *           *            *                                    \n");
	printf("                        *                      *              *          *                                    \n");
	printf("                   (8)贵阳             (6)武汉 * * * * * * * *合肥(11)   *                                    \n");
	printf("                     *   *                  *                  *         *                                    \n");
	printf("                   *      *               *                      *       *                                    \n");
	printf("                 *          *           *                         *      *                                    \n");
	printf("                *            *        *                            *     *                                    \n");
	printf("            (10)昆明          *     *                                *南京 (4)                                \n");
	printf("                           (7) 长沙                                     *                                    \n");
	printf("                                                                           *                                 \n");
	printf("                                                                             *                               \n");
	printf("                                                                               *                             \n");
	printf("                                                                                  *上海(3)                    \n");
	printf("                                                                                                              \n");
	
}

//弗洛伊德算法
void Floyd()
{
	int i, j, k;
	for (i = 1; i <= m.point; i++)
	{
		for (j = 1; j <= m.point; j++)
		{
			dist[i][j] = m.edge[i][j];
			if (i != j && dist[i][j] < PP)
			{
				path1[i][j] = i;
			}
			else
			{
				path1[i][j] = -1;
			}
		}
	}
	//printf("%d\n",g.n);
	for (k = 1; k <= m.point; k++)
	{
		for (i = 1; i <= m.point; i++)
		{
			for (j = 1; j <= m.point; j++)
			{
				if (dist[i][j] > (dist[i][k] + dist[k][j]))
				{
					dist[i][j] = dist[i][k] + dist[k][j];
					path1[i][j] = k;
				}
			}
		}
	}
	return;
}
void Floyd_print(int s, int e)
{
	if (path1[s][e] == -1 || path1[s][e] == e || path1[s][e] == s)
	{
		return;
	}
	else
	{
		Floyd_print(s, path1[s][e]);
		printf("%s->", m.s[path1[s][e]].name);
		Floyd_print(path1[s][e], e);
	}
}
void Multispot()
{
	int vNum[20] = { 0 };
	int i, j, dis1, a;
	j = 1;
	dis1 = 0;
	printf("请输入你要游览的第%d个景点的编号(输入-1结束输入):", j);
	scanf("%d", &vNum[j]);
	while (vNum[j] != -1 && j <= 14)
	{
		printf("请输入你要游览的第%d个景点编号:", ++j);
		scanf("%d", &vNum[j]);
		if (vNum[j] != -1)
			a = vNum[j];
		if (vNum[j] == -1)
		{
			break;
		}
	}
	printf("\n这是最佳访问路径:");
	for (i = 0; vNum[i + 1] > 0 && vNum[i + 2] > 0; i++)
	{
		printf("%s->", m.s[vNum[i + 1]].name);
		Floyd_print(vNum[i + 1], vNum[i + 2]);
		dis1 += dist[vNum[i + 1]][vNum[i + 2]];
	}
	printf("%s\n\n", m.s[a].name);
	printf("全程总长为:%dm\n\n", dis1);
}

int main()
{
	int n;
	maps();
	make_map();
	make_site();
	while (1)
	{
		n = menu();
		if (n < 1 || n>5)
			printf("输入错误,请重新输入\n");
		else
		{
			if (n == 1)
				Search();
			else if (n == 2)
				mshort();
			else if (n == 3)
				ashort();
			else if (n == 4)
			{
				maps();
				Floyd();
				Multispot();
			}

			else if (n == 0)
				break;

		}

	}

	while (1);
	return 0;
}

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值