#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;
}
数据结构课设---基于弗洛伊德算法的城市旅游交通路线推荐系统
最新推荐文章于 2024-01-22 21:36:40 发布