题目
设计目的:
熟练掌握迪杰斯特拉算法和费洛伊德算法,能够利用它们解决最短路径问题。
掌握图的深度,广度遍历算法。
掌握快速排序算法。
内容:
设计一个交通咨询系统,通过读取全国城市距离图(在https://pan.baidu.com/s/1MOl4Lf_SgSnYWHFm29z70w中有三个csv文件用来读取,提取码是5n1o,如想按照我的程序运行必须将这三个文件放在和cpp和.h同一个文件夹内,如修改程序请将读取文件内容函数进行修改—1.csv是邻接矩阵(只有0和1),2.csv是下三角城市间距离,3.csv是城市名字)**,实现:
1、请验证全国其他省会城市(不包括港澳和两个宝岛台北和海口)到武汉中间不超过 2 个省(省会城市)是否成立?(正是因为武汉处于全国的中心位置,此次疫情才传播的如此广);
2、允许用户查询从任一个城市到另一个城市之间的最短路径(两种算法均要实现,界面上可自行选择)以及所有不重复的可行路径(可限制最多经过 5 个节点),并利用快速排序对所有路径方案依据总长度进行排序输出(输出到文件),每一条结果均需包含路径信息及总长度,试比较排序后的结果与迪杰斯特拉算法和费洛伊德算法输出的结果;
3、假设在求解 2 个城市间最短路径时需要绕过某个特定的城市(用户输入或者选择,例如武汉),请问应该如何实现?
4、不基于功能 2 遍历的结果如何直接求解两个城市间的前第 K 短的路径,例如,武汉到北京之间第 3 短的路径。
graph.h
//这是里头文件graph.h
#pragma once
#include<iostream>
#include<fstream>
#include<sstream>
#include<string>
#include<queue>
#include<stack>
using namespace std;
const int MAX = 10000;
void quickSort(int left, int right, int a[], string s[], int size);
class Gragh
{
private:
const char* a[34];
int edge[34][34];
int n, e, path_num;
bool Mark[34];
int Path[50][11];
int Path_date[50];
int result[34];
public:
Gragh(); //初始化各变量
void creat_Gragh(); //构建图及其临接矩阵
int find(string str); //将城市名称转化为编号
void BFT(Gragh g); //通过BFT来验证武汉处于全国中心位置
void Dijkstra(string str1, string str2, string str3 = "无"); //Dijkstra算法,第三个参数缺省来实现要求二三
void Floyd(string str1, string str2, string str3 = "无"); //Floyd算法
void All_Load(string str1, string str2); //
void Find_All_Load(int pos1, int pos2); //查找算法
void A_star(string str1, string str2, int k); //A*算法来实现第k短问题
};
struct edge1 //用于A*算法中将开销与编号封装
{
int num;
int cost, last_cost; //cost记录的是当前路径的总花销,last_cost记录的是此节点的父节点到起点的花销
//A*算法中,花销包含两部分,第一部分是起点到中间节点的距离(last_cost+edge[][]),第二部分是迪杰斯塔拉结果(dist[])
string str;
bool operator <(const edge1& s)const //用于优先队列,顺序是从小到大
{
return cost > s.cost;
}
};
Gragh::Gragh() //构造函数用来初始化
{
for (int i = 0; i < 50; i++)
{
Path_date[i] = 0;
for (int j = 0; j < 11; j++)
Path[i][j] = -1;
}
for (int i = 0; i < 34; i++)
{
Mark[i] = false;
result[i] = 0;
for (int j = 0; j < 34; j++)
{
if (i == j) edge[i][j] = 0;
else edge[i][j] = MAX;
}
}
n = 0;
path_num = 0;
}
void Gragh::creat_Gragh() //读取3个文件来构造图
{
int temp[600] = {
0 };
string str;
{
ifstream fin_2("2.csv");
for (int tem = 0; fin_2.eof() == false; tem++)
{
getline(fin_2, str, ',');
if (str == "0")
{
getline(fin_2, str, '\n');
getline(fin_2, str, ',');
cin.sync();
}
istringstream is(str);
is >> temp[tem];
}
}
ifstream fin_3("3.csv");
for (int i = 0; i < 34; i++)
{
getline(fin_3, str, ',');
string* str_1 = new string(str);
a[i] = str_1->c_str();
}
ifstream fin_1("1.csv");
for (int i = 0; i < 34; i++)
{
for (int j = 0; j < 34; j++)
{
if (j == 33)
{
getline(fin_1, str, '\n');
if (str != "1" || j