#include<iostream>
#include<fstream>
#include<string>
#define MaxVerNum 100//最大结点个数
#define INF 65535
#define MM "2222"
using namespace std;
typedef char VertexType;//图中顶点的数据类型
typedef int eInfoType;//权值的数据类型
//栈
typedef struct IsNode
{
int data;
struct IsNode * inext;
}sNode;
//时间
typedef struct
{
int hours;
char synbol;
int minutes;
}Time;
//班次
typedef struct
{
int divisions;//班次
Time firstBusTime;//首班车的出发时间
}schedules;
typedef schedules Schedules[MaxVerNum];
//城市
typedef struct node//边链表节点
{
int adjvex;
eInfoType eInfo;
struct node * next;
}EdgeNode;
typedef struct//顶点表节点
{
VertexType vertex[20];
EdgeNode * firstedge;
}VertexNode;
typedef VertexNode AdjList[MaxVerNum];
typedef struct
{
AdjList adjlist;
int n,e;
}ALGraph;
//火车
typedef struct trainTime
{
int trainName;
int time;
int stopTime;
int money;
int distance;
struct trainTime * nextStation;
}train;
typedef struct
{
int trainName;
train * trainRoute;
}trainN;
typedef trainN trainS[MaxVerNum];
typedef struct
{
trainS trainSchedule;
int m;
Schedules Train;
}trainlist;
//飞机
typedef struct planeTime
{
int planeName;
int platime;
int plastoptime;
int plamoney;
int pladistance;
struct planeTime * planextStation;
}plane;
typedef struct
{
int planeName;
plane * planeRoute;
}planeN;
typedef planeN planeS[MaxVerNum];
typedef struct
{
planeS planeSchedule;
int x;
Schedules Plane;
}planelist;
//函数声明
void create(ALGraph * & G);
void printA(ALGraph * G);
void new_line();
void createTrainSchedule(ALGraph * G,trainlist * & T,int **,int **);
void printTrain(ALGraph * G,trainlist * T);
void createplaneSchedule(ALGraph * G,planelist * & H,int **,int **);
void printplane(ALGraph * G,planelist * H);
void administrator(ALGraph * G,trainlist * T,planelist * H,int **,int **,int **,int **,int **,int **,int **,int **);
void user();
void establishFigure(ALGraph * G);
void estFigure(ALGraph * G);
void establishTrain(ALGraph * G,trainlist * T,int **,int **);
void estTrain(ALGraph * G,trainlist * T,int **,int **);
void establishPlane(ALGraph * G,planelist * H,int **,int **);
void estPlane(ALGraph * G,planelist * H,int **,int **);
void printTime(ALGraph * G,trainlist * T);
void initializeTrainPathMatrix(ALGraph * G,int **,int **);
void createTrainPathMatrix(trainlist * T,int **,int **,int *,int num,int k);
void printTrainPathMatrix(ALGraph * G,int **,int **,int *);
void trainFloyd(ALGraph * G,int **,int **,int **);
void initialStack(sNode * & top);
void pushStack(sNode * & top,int x);
void popStack(sNode * & top,int &x);
void printTFloyd(ALGraph * G,int **,int **);
void estffile(ALGraph * &G);
void estffileTrain(ALGraph * G,trainlist * & T,int **,int **);//文件输入建立火车时刻表
void initializePlanePathMatrix(ALGraph * G,int **,int **);
void createPlanePathMatrix(planelist * H,int **,int **,int *,int num,int k);
void printPlanePathMatrix(ALGraph * G,int **,int **,int *);
void estffilePlane(ALGraph * G,planelist * & H,int **,int **);
void addCity(ALGraph * &G);
void deleteCity(ALGraph * &G);
void addTrainPath(ALGraph * G,trainlist * & T,int **,int **);
void deleteTrainPath(ALGraph * G,trainlist * & T,int **,int **);
void addPlanePath(ALGraph * G,planelist * & T,int **,int **);
void deletePlanePath(ALGraph * G,planelist * & H,int **,int **);
void printPlane(ALGraph * G,planelist * H);
//输入、输出流声明
ifstream in_stream;
ofstream out_stream;
//主函数
int main()
{
int num,i;
char n[5];
ALGraph * G=(ALGraph *)malloc(sizeof(ALGraph));
trainlist * T=(trainlist *)malloc(sizeof(trainlist));
planelist * H=(planelist *)malloc(sizeof(planelist));
int **trainPath=new int * [MaxVerNum];
for(i=0;i<MaxVerNum;i++)
trainPath[i]=new int[MaxVerNum];
int ** tmPath=new int *[MaxVerNum];
for(i=0;i<MaxVerNum;i++)
tmPath[i]=new int[MaxVerNum];
int ** tmDisk=new int *[MaxVerNum];
for(i=0;i<MaxVerNum;i++)
tmDisk[i]=new int[MaxVerNum];
int ** tPath=new int *[MaxVerNum];
for(i=0;i<MaxVerNum;i++)
tPath[i]=new int[MaxVerNum];
int **planePath=new int * [MaxVerNum];
for(i=0;i<MaxVerNum;i++)
planePath[i]=new int[MaxVerNum];
int ** pmPath=new int *[MaxVerNum];
for(i=0;i<MaxVerNum;i++)
pmPath[i]=new int[MaxVerNum];
int ** pmDisk=new int *[MaxVerNum];
for(i=0;i<MaxVerNum;i++)
pmDisk[i]=new int[MaxVerNum];
int ** pPath=new int *[MaxVerNum];
for(i=0;i<MaxVerNum;i++)
pPath[i]=new int[MaxVerNum];
do
{
cout<<endl;
cout<<" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@";
cout<<endl;
cout<<endl;
cout<<" 欢迎使用全国交通咨询模拟系统"<<endl;
cout<<endl;
cout<<endl;
cout<<" 1------------管理员"<<endl;
cout<<" 2------------普通用户"<<endl;
cout<<" 3------------退出"<<endl;
cout<<endl;
cout<<" 请选择序号:";
cin>>num;
switch(num)
{
case 1:do
{
cout<<" 请输入密码:";
cin>>n;
}while(strcmp(n,MM));
administrator(G,T,H,trainPath,tmPath,tPath,tmDisk,planePath,pmPath,pPath,pmDisk);
break;
/*case 2:user();
break;*/
}
}while(num!=3);
cout<<endl;
return 0;
}
//管理员函数
void administrator(ALGraph * G,trainlist * T,planelist * H,int ** trainPath,int ** tmPath,int ** tPath,int ** tmDisk,int ** planePath,int ** pmPath,int ** pPath,int ** pmDisk)
{
int i;
do
{
cout<<endl;
cout<<" 1------------建立全国交通图"<<endl;
cout<<" 2------------建立火车时刻表"<<endl;
cout<<" 3------------建立航空时刻表"<<endl;
cout<<" 4------------查询最省钱路线"<<endl;
cout<<" 5------------查询最快路线"<<endl;
cout<<" 6------------退出"<<endl;
cout<<endl;
cout<<" 请选择序号:";
cin>>i;
switch(i)
{
case 1:establishFigure(G);break;
case 2:establishTrain(G,T,trainPath,tmPath);break;
case 3:establishPlane(G,H,planePath,pmPath);break;
case 4:
trainFloyd(G,tmPath,tPath,tmDisk);
printTFloyd(G,tPath,tmDisk);break;
};
}while(i!=6);
}
//建立全国交通图
void establishFigure(ALGraph * G)
{
int i;
do
{
cout<<endl;
cout<<" 1------------手动输入建立"<<endl;
cout<<" 2------------文件输入建立"<<endl;
cout<<" 3------------添加城市"<<endl;
cout<<" 4------------删除城市"<<endl;
cout<<" 5------------退出"<<endl;
cout<<endl;
cout<<" 请选择序号:";
cin>>i;
switch(i)
{
case 1:estFigure(G);break;
case 2:estffile(G);break;
case 3:addCity(G);break;
case 4:deleteCity(G);break;
case 5:break;
default:cout<<" 错误选择!!!请重选";
}
}while(i!=5);
}
//文件输入建立全国交通图
void estffile(ALGraph * &G)
{
int v,k,i,j;
cout<<" *****************************************************************************************"<<endl;
cout<<endl;
cout<<" 开始创建全国交通图"<<endl;
cout<<endl;
in_stream.open("chengshi.dat");
EdgeNode * s;
in_stream>>G->n>>G->e;
for(v=0;v<G->n;v++)
{
in_stream>>G->adjlist[v].vertex;
G->adjlist[v].firstedge=NULL;
}
for(k=0;k<G->e;k++)
{
in_stream>>i;
in_stream>>j;
s=(EdgeNode *)malloc(sizeof(EdgeNode));
s->adjvex=j;
s->next=G->adjlist[i-1].firstedge;
G->adjlist[i-1].firstedge=s;
in_stream>>G->adjlist[i-1].firstedge->eInfo;
s=(EdgeNode *)malloc(sizeof(EdgeNode));
s->adjvex=i;
s->next=G->adjlist[j-1].firstedge;
G->adjlist[j-1].firstedge=s;
G->adjlist[j-1].firstedge->eInfo=G->adjlist[i-1].firstedge->eInfo;
}
in_stream.close();
cout<<" 建立的全国交通图的邻接表为:"<<endl;
for(i=0;i<G->n;i++)
{
EdgeNode * q=G->adjlist[i].firstedge;
cout<<" "<<G->adjlist[i].vertex<<"->";
while(q!=NULL)
{
cout<<G->adjlist[(q->adjvex)-1].vertex;
cout<<"("<<q->eInfo<<")";
cout<<"->";
q=q->next;
}
cout<<"NULL"<<endl;
}
cout<<endl;
cout<<" 全国交通图已创建完成"<<endl;
cout<<endl;
cout<<" *****************************************************************************************"<<endl;
cout<<endl;
}
//文件输入建立火车时刻表
void estffileTrain(ALGraph * G,trainlist * & T,int ** trainPath,int ** tmPath)
{
int i,j,v;
int traStation[MaxVerNum];
cout<<" *****************************************************************************************"<<endl;
cout<<endl;
cout<<