- 交通咨询系统(最短路径问题)
3.1 【问题描述】
给定一个地区的n个城市间的距离网,计算任意两个城市之间的最短路径。
3.2 【基本要求】
程序包含4个模块:
(1)输入城市信息;城市之间的距离网用邻接矩阵表示,如图2所示。(至少要求6个城市,10条边,设定9999为不可达)
图2 城市网的邻接矩阵定义
(2)打印城市信息和城市之间的直接可达距离;
输出格式要求:城市的列表如下,共有5个城市:
( 1)太原( 2)北京( 3)上海
( 4)深圳( 5)广州
太原到北京距离15万公里;
太原到上海距离20万公里;
太原到广州不能直接到达;
注意: 城市及编号可以任意设定,但必须按输出格式要求显示;距离和可否直接可达可以虚构。
(3)计算任意两个城市之间的最短路径;
格式要求:提示用户输入选择的起点城市序号和终点城市序号,如果输入的城市序号不在,提示出错并请用
户重新输入;
输出起点城市到终点城市的最短路径及路径长度
(4)退出
这个用的是弗洛伊德算法,算法原理这里不再赘述,网上讲解资源很多。
直接上代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
using namespace std;
const int N = 210, M = 1000, INF = 0x3f3f3f3f;
int n,m;//城市数,边数
int g[N][N],path[N][N];//g为邻接矩阵,path矩阵表示到达终点所需要经过的中间点
unordered_map<int, string> d; //建立一个序号与城市之间映射的散列表
//函数声明
void shuru(); //输入城市信息
void printCityInfo(); //打印城市信息
void floyd(); //弗洛伊德算法
void query(); //计算任意两个城市之间的最短路径
//用来存边
struct Edge
{
int a,b,w;
}edges[M];
//输入城市信息
void shuru()
{
//初始化邻接矩阵
// for(int i = 1; i <= n; i++)
// for(int j = 1; j <= n; j++)
// if(i == j) g[i][j] == 0;
// else g[i][j] = INF;
memset(g, 0x3f, sizeof g);
printf("请输入城市数n和边数m:\n");
scanf("%d%d",&n,&m); //输入城市数,边数
//请输入n个城市名称,用空格隔开:
printf("请输入n个城市名称,用空格隔开:\n");
for(int i = 1; i <= n; i++)
{
string cityname;
cin >> cityname;
d[i] = cityname;
}
printf