数据结构 严蔚敏 第六章 图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;
}