全国交通咨询模拟系统

数据结构 严蔚敏 第六章 图6.6.2
简易版
具体实现修改vexs顶点表,a,b,c改为地点名
仅使用Dijkstra算法
如果是为了最少转站,对图使用广度优先即可
还有读入地图使用file之类的细节有空再改

#include <iostream>
using namespace std;
#define MaxInt 32767 //表示极大值,即∞
#define MVNum 100 //最大顶点数
#define OK 1
typedef char VerTexType; //假设顶点的数据类型为字符型
typedef int ArcType; //假设边的权值类型为整型

int S[MVNum];			//记录源点到终点是否已经被确定最短路径长度
int Path[MVNum];		//记录从源点到终点的最短路径上终点的前驱顶点序号
int D[MVNum];			//记录源点到终点的最短路径长度

//图的邻接矩阵存储表示
typedef struct{
VerTexType vexs[MVNum]; //顶点表
ArcType arcs[MVNum][MVNum]; //费用
ArcType time[MVNum][MVNum]; //时间
int vexnum,arcnum,timenum; //图的当前点数和边数
}AMGraph;

int LocateVex(AMGraph G , VerTexType v){//确定点v在G中的位置
	for(int i = 0; i < G.vexnum; ++i)
		if(G.vexs[i] == v)	
			return i;
	return -1;
}

//火车费用图
void CreateTrain(AMGraph &G){
	G.vexnum = 6;
	G.arcnum = 8;
	for(int i = 0; i < G.vexnum; ++i) //初始化费用邻接矩阵,边的权值均置为极大值MaxInt
	for(int j = 0; j < G.vexnum; ++j)
	G.arcs[i][j] = MaxInt;
	for(int i = 0; i < G.vexnum; ++i) //初始化时间邻接矩阵,边的权值均置为极大值MaxInt
	for(int j = 0; j < G.vexnum; ++j)
	G.time[i][j] = MaxInt;
	G.vexs[0] = 'a';
	G.vexs[1] = 'b';
	G.vexs[2] = 'c';
	G.vexs[3] = 'd';
	G.vexs[4] = 'e';
	G.vexs[5] = 'f';
	G.arcs[0][2] = 10;
	G.arcs[0][4] = 30;
	G.arcs[0][5] = 100;
	G.arcs[1][2] = 5;
	G.arcs[2][3] = 50;
	G.arcs[3][5] = 10;
	G.arcs[4][3] = 20;
	G.arcs[4][5] = 60;
	G.time[0][2] = 1;
	G.time[0][4] = 3;
	G.time[0][5] = 10;
	G.time[1][2] = 5;
	G.time[2][3] = 2;
	G.time[3][5] = 1;
	G.time[4][3] = 2;
	G.time[4][5] = 6;
}

//飞机费用图
void CreatePlane(AMGraph &G){
	G.vexnum = 6;
	G.arcnum = 8;
	for(int i = 0; i < G.vexnum; ++i) //初始化邻接矩阵,边的权值均置为极大值MaxInt
	for(int j = 0; j < G.vexnum; ++j)
	G.arcs[i][j] = MaxInt;
	for(int i = 0; i < G.vexnum; ++i) //初始化时间邻接矩阵,边的权值均置为极大值MaxInt
	for(int j = 0; j < G.vexnum; ++j)
	G.time[i][j] = MaxInt;
	G.vexs[0] = 'a';
	G.vexs[1] = 'b';
	G.vexs[2] = 'c';
	G.vexs[3] = 'd';
	G.vexs[4] = 'e';
	G.vexs[5] = 'f';
	G.arcs[0][2] = 20;
	G.arcs[0][4] = 40;
	G.arcs[0][5] = 125;
	G.arcs[1][2] = 14;
	G.arcs[2][3] = 56;
	G.arcs[3][5] = 34;
	G.arcs[4][3] = 77;
	G.time[0][2] = 2;
	G.time[0][4] = 4;
	G.time[0][5] = 12;
	G.time[1][2] = 1;
	G.time[2][3] = 5;
	G.time[3][5] = 3;
	G.time[4][3] = 7;
}
void ShowPath(AMGraph G1,int v)
{
	if (Path[v] == -1)
		return;
	ShowPath(G1,Path[v]);
	cout << G1.vexs[Path[v]] << "->";
}

void ShortestMoney_DIJ(AMGraph G,int v){
	int min,a;
	for(int i = 0;i<G.vexnum;i++){	//顶点初始化
		S[i] = false;				//S初始为空集
		D[i] = G.arcs[v][i];		//将v到各个终点的最短路径化为弧上的权值
		if(D[i] < MaxInt)			//如果有弧,置为v,否则置为-1
			Path[i] = v;
		else
			Path[i] = -1;
	}
	S[v] = true;	//将v加入s
	D[v] = 0;		//源点到源点的距离为0
	//初始化结束
	for(int j = 1;j < G.vexnum;j++){
		min = MaxInt;
		for(int w = 0;w < G.vexnum;w++)
			if(!S[w] && D[w]<min){
				v = w;
				min = D[w]; 
			}
		S[v] = true;
		for(int w = 0;w < G.vexnum;w++)
			if(!S[w] && (D[v]+G.arcs[v][w]<D[w])){
				D[w] = D[v]+G.arcs[v][w];
				Path[w] = v;
			}
	}
	cout << "请选择目的地:";
	cin >> a;
	if(D[a] != MaxInt){
		cout << "到"<< G.vexs[a] << "的最少费用为:" << D[a] << "元	";
		cout << "费用最少路径:";
		ShowPath(G,a);
		cout << G.vexs[a];
		cout << endl;
		}
	else
		cout << "到"<< G.vexs[a] << "没有路" << endl;
}

void ShortestTime_DIJ(AMGraph G,int v){
	int min,a;
	for(int i = 0;i<G.vexnum;i++){	//顶点初始化
		S[i] = false;				//S初始为空集
		D[i] = G.time[v][i];		//将v到各个终点的最短路径化为弧上的权值
		if(D[i] < MaxInt)			//如果有弧,置为v,否则置为-1
			Path[i] = v;
		else
			Path[i] = -1;
	}
	S[v] = true;	//将v加入s
	D[v] = 0;		//源点到源点的距离为0
	//初始化结束
	for(int j = 1;j < G.vexnum;j++){
		min = MaxInt;
		for(int w = 0;w < G.vexnum;w++)
			if(!S[w] && D[w]<min){
				v = w;
				min = D[w]; 
			}
		S[v] = true;
		for(int w = 0;w < G.vexnum;w++)
			if(!S[w] && (D[v]+G.time[v][w]<D[w])){
				D[w] = D[v]+G.time[v][w];
				Path[w] = v;
			}
	}
	cout << "请选择目的地:";
	cin >> a;
	if(D[a] != MaxInt){
		cout << "到"<< G.vexs[a] << "的最少耗时为:" << D[a] << "小时	";
		cout << "耗时最少路径:";
		ShowPath(G,a);
		cout << G.vexs[a];
		cout << endl;
		}
	else
		cout << "到"<< G.vexs[a] << "没有路" << endl;
}
//打印费用地图
void PrintMoney(AMGraph G){
	for(int i = 0 ; i < G.vexnum ; ++i){
		for(int j = 0; j < G.vexnum; ++j){
			if(j != G.vexnum - 1){
				if(G.arcs[i][j] != MaxInt)
					cout << G.arcs[i][j] << "\t";
				else
					cout << "∞" << "\t";
			}
			else{
				if(G.arcs[i][j] != MaxInt)
					cout << G.arcs[i][j] <<endl;
				else
					cout << "∞" <<endl;
			}
		}
	}
}
//打印时间地图
void PrintTime(AMGraph G){
	for(int i = 0 ; i < G.vexnum ; ++i){
		for(int j = 0; j < G.vexnum; ++j){
			if(j != G.vexnum - 1){
				if(G.time[i][j] != MaxInt)
					cout << G.time[i][j] << "\t";
				else
					cout << "∞" << "\t";
			}
			else{
				if(G.time[i][j] != MaxInt)
					cout << G.time[i][j] <<endl;
				else
					cout << "∞" <<endl;
			}
		}
	}
}

int main(){
	AMGraph G1,G2;
	int choose = -1, a;
	CreateTrain(G1);
	CreatePlane(G2);
	cout << "***********欢迎使用全国交通咨询模拟系统***********\n";
	cout << "		请选择您的出行方式\n";
	cout << "		1. 火车\n";
	cout << "		2. 飞机\n";
	cout << "		0. 退出\n";
	while (choose != 0)
	{
		cout << "\n请输入您的选择:";
		cin >> choose;
		switch (choose) {
		case 1:
			cout << "    ***********火车费用地图***********" << endl;
			PrintMoney(G1);
			cout << "\n    ***********火车时间地图***********" << endl;
			PrintTime(G1);
			cout << "请选择您的出行策略"<<endl;
			cout << "3.费用最少"<<endl;
			cout << "4.时间最少"<<endl;
			break;
		case 2:
			cout << "    ***********飞机费用地图***********" << endl;
			PrintMoney(G2);
			cout << "\n    ***********飞机时间地图***********" << endl;
			PrintTime(G2);
			cout << "请选择您的出行策略"<<endl;
			cout << "5.费用最少"<<endl;
			cout << "6.时间最少"<<endl;
			break;
		case 3:
			cout << "请选择出发地:";
			cin >> a;
			ShortestMoney_DIJ(G1,a);
			break;
		case 4:
			cout << "请选择出发地:";
			cin >> a;
			ShortestTime_DIJ(G1,a);
			break;
		case 5:
			cout << "请选择出发地:";
			cin >> a;
			ShortestMoney_DIJ(G2,a);
			break;
		case 6:
			cout << "请选择出发地:";
			cin >> a;
			ShortestTime_DIJ(G2,a);
			break;
		}
}
	cout << endl;
	cout << "再见!\n";
	system("pause");
	return 0;
}

在这里插入图片描述

全国交通查询模拟系统 【问题描述】处于对不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则希望旅费尽可能省,而老年旅客则要求中转次数最少。编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。 【基本要求】(1)提供对城市信息进行编辑(如:添加或删除)的功能。 (2)城市之间有两种交通工具:火车和飞机。提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。 (3)提供两种最优决策:最快到达或最省钱到达。全程只考虑一种交通工具。 (4)旅途中耗费的总时间应该包括中转站的等候时间。 (5)咨询以用户和计算机的对话方式进行。由用户输入起始站、终点站、最优决策原则和交通工具,输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。 【实现提示】(1)对全国城市交通和班车时刻表及飞机航班表的编辑,应该提供文件形式输入和键盘输入两种方式。飞机航班表的信息应包括:起始站的出发时间、终点站的到达时间和票价;列车时刻表则需根据交通给出各个路段的详细信息,例如:对于从北京到上海的火车,需给出北京至天津、天津至徐州及徐州至各段的出发时间、到达时间和票价信息。 (2)以邻接表作交通的存储结构,表示边的结点内除含有邻接点的信息外,包括交通工具、路程中消耗的时间和花费以及出发和到达的时间等多项属性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值