一、实验题目
当一个用户从甲地到乙地时,由于不同需求,就有不同的交通路线,有人希望以最短时间到达,有人希望用最少的换乘次数等。请编写一北京地铁线路查询系统,通过输入起始站、终点站,为用户提供两种决策的交通咨询。
设计要求:
1.提供对地铁线路进行编辑的功能,要求可以添加或删除线路。
2.提供两种决策:最短时间,最少换乘次数。
3.中途换乘站换乘耗时为5分钟,地铁在除始发站外每一站停留1分钟。
4.按照始发站时间、地铁时速及停留时间推算之后各个线路的地铁到站时间。
5.该系统以人机对话方式进行。系统自动获取当前时间,用户输入起始站,终点站以及需求原则(需求原则包括最短距离,最短时间,最少换乘次数),系统输出乘车方案:乘几号线,距离,时间,费用,换乘方法等相关信息。
二、代码实现
#include<iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#define MAX 9999//根据权重调整
#define N 20//最长名称
#define NUM 999//最大站数
using namespace std;
struct station//站点信息
{
char station[N];//站点名称
bool change;//换乘状态,1为是,0为否
int tag;//站点所属线路个数
char Line[6][N];//站点所属线路名称
};
struct adjacence//两站间信息
{
int weight;//两站间乘坐时间,包括地铁停留时间,单位为米/分
char line[N];//两站共同所属线路名称
int distance;//两站间距离,单位为米
int inaline;//两站是否属于一条线路,是为1,否为MAX
};
struct timetable
{
char lines[N];//线路名称
char firststa[N];//起点站
char nextsta[N];//起点站的下一站
bool isweekend;//工作日为0,周末为1
bool exacttime[24][60];//具体发车时间
};
class subway
{
private:
int nowsum;//实际地铁站数
int nowsub;//实际地铁线路数
int nowtimesum;//实际时间表数,每条线路有四份时间表
char subname[NUM][N];//地铁线路名称
int path[NUM];//途径站点路径
bool s[NUM];//记录站点是否已被添加,即起始站到该站点的最短路径是否已被找到
int disk[NUM];//记录起始站到某站点的乘坐时间,不包括换乘时间
int stack[NUM];//存储起始站到终点站路径的栈
int stackft[NUM];//为了subtime函数创建的stack的副本,subway中所有名为xx+ft的,都是xx for time的意思,为副本
int top = -1;//栈顶标记
int topft = -1;//副本
station sta[NUM];//地铁站点数组
adjacence adj[NUM][NUM];//地铁图
timetable tt[NUM];//时间表数组
public:
subway()//构造函数,private成员初始化
{
nowsum = 0;
nowsub = 0;
nowtimesum = 0;
for (int i = 0; i < NUM; i++)
{
sta[i].tag = 0;//地铁站点数组初始化
sta[i].change = 0;
sta[i].station[0] = { '\0' };
sta[i].Line[0][0] = sta[i].Line[1][0] = sta[i].Line[2][0] = { '\0' };
sta[i].Line[3][0] = sta[i].Line[4][0] = sta[i].Line[5][0] = { '\0' };
subname[i][0] = { '\0' };
for (int j = 0; j < NUM; j++)
{//地铁图地铁图
adj[i][j].weight = MAX;
adj[i][j].line[0] = { '\0' };
adj[i][j].distance = MAX;
adj[i][j].inaline = MAX;
}
tt[i].isweekend = 0;//时间表数组
tt[i].lines[0] = tt[i].firststa[0] = tt[i].nextsta[0] = { '\0' };
for (int j = 0; j < 24; j++)
{
for (int k = 0; k < 60; k++)
tt[i].exacttime[j][k] = 0;
}
}
}
void push(int n)//入栈
{
if (top < NUM - 1)
{
top++;
stack[top] = n;
}
else
return;
}
void pushft(int n)//入栈,副本
{
if (topft < NUM - 1)
{
topft++;
stackft[topft] = n;
}
else
return;
}
bool empty()//判断栈是否为空
{
if (top < 0)
return 1;
else
return 0;
}
bool emptyft()//判断栈是否为空,副本
{
if (topft < 0)
return 1;
else
return 0;
}
int pop()//出栈
{
if (empty())
return -1;
else
return stack[top--];
}
int popft()//出栈,副本
{
if (emptyft())
return -1;
else
return stackft[topft--];
}
int search(char * s)//查找s在地铁站点数组中的下标
{
for (int i = 0; i < nowsum; i++)
{
if (!strcmp(sta[i].station, s))
return i;
}
return -1;//若数组中不存在该站点
}
void create(int n)//创建地铁图
{
while (n)//读取线路的大循环
{
char linename[N];//每条线路的名称
int sum;//每条线路的站数
int speed;//每条线路的平均速度
cin >> linename >> sum;
strcpy(subname[nowsub++], linename);
cout << linename << "线 共" << sum << "个站" << endl;
cin >> speed;
int last = -1;//上一站,表示现在的站是否为线路起点站
while (sum)//读取站点的小循环
{
char name[N];//站点名称
bool ischange;//站点换乘状态
int Distance;//两站间距离
cin >> name >> ischange >> Distance;
if (ischange == 1)//是换乘站
cout << name << "(换乘站)->";
else//非换乘站
cout << name << "->";
if (search(name) == -1)//若该站点是第一次出现
{
strcpy(sta[nowsum].station, name);
sta[nowsum].change = ischange;
strcpy(sta[nowsum].Line[sta[nowsum].tag++], linename);
if (last != -1)//非线路起始站
{
strcpy(adj[last][nowsum].line, linename);
strcpy(adj[nowsum][last].line, linename);
adj[last][nowsum].distance = adj[nowsum][last].distance = Distance;
adj[last][nowsum].weight = adj[nowsum][last].weight = round(Distance / speed) + 1;
}//+1是地铁在每一站停留的时间
last = nowsum;//更新上一站
nowsum++;//更新站点总数
}
else//若该站点已存在
{
strcpy(sta[search(name)].Line[sta[search(name)].tag++], linename);
if (last != -1)//非线路起始站
{
strcpy(adj[last][search(name)].line, linename);
strcpy(adj[search(name)][last].line, linename);
adj[last][search(name)].distance = adj[search(name)][last].distance = Distance;
adj[last][search(name)].weight = adj[search(name)][last].weight = round(Distance / speed) + 1;
}//+1是地铁在每一站停留的时间
last = search(name);//更新上一站
}
sum--;
}
char back = 8;//回退两格,删除多余的一个"->"
cout << back << back << " " << endl << endl;
n--;
}
}
void creattimetable()//创建时间表
{
freopen("首站发车时间.txt", "r", stdin);//打开文件读取内容
int n;//时间表总数
cin >> n;
while (n)//读取线路时间表的大循环
{
int is = 0;
char name1[N], name2[N], name3[N];
cin >> name1 >> name2 >> name3 >> is;
strcpy(tt[nowtimesum].lines, name1);//线路名称
strcpy(tt[nowtimesum].firststa, name2);//起始站
strcpy(tt[nowtimesum].nextsta, name3);//起始站的下一站
tt[nowtimesum].isweekend = is;//是否为周末,是为1,否为0
int m;//线路运行的小时个数
cin >> m;
while (m)//读取每个小时发车时间的小循环
{
int k;//小时
cin >> k;
int a;//分钟
while (cin >> a)
{
tt[nowtimesum].exacttime[k][a] = 1;
if (cin.get() == '\n')
break;
}
m--;
}
n--;
nowtimesum++;
}
cin.clear();更改cin的状态标示符
freopen("CON", "r", stdin);//将标准输入重定向为 CON 控制台
freopen("CON", "w", stdout);
}
void dijkstra(int start, int end)//寻找最短时间的方案
{//按路径长度递增的次序产生起点站到其余各站点的最短路径
for (int i = 0; i < nowsum; i++)
{//初始化辅助数组
s[i] = 0;
disk[i] = adj[start][i].weight;
path[i] = start;
}
s[start] = 1;//起始站已被添加
disk[start] = 0;//起始站到自身耗费时间为0
int minweight;
for (int i = 0; i < nowsum - 1; i++)
{//找到未被添加的最小权重值即最短时间的站点
int m = -1, j = 0;
minweight = MAX;
for (j = 0; j < nowsum; j++)//更新辅助数组
{
if (!s[j] && disk[j] < minweight)
{
minweight = disk[j];
m = j;//选出从起点站能够直接到达某个站点的所有路径中最短的路径
}
}
s[m] = 1;//标记该站点已找到最短路径
if (m == end)//若已找到到达终点站的最短路径
return;
for (int k = 0; k < nowsum; k++)
{//找出以这条路径作为转发路径到达其他站点的路径
if (!s[k])
{
int Weight = minweight + adj[m][k].weight;
if (!strcmp(adj[path[m]][m].line, adj[m][k].line))
{//若无需换乘
if (Weight < disk[k])
{//若新路径更短则更新路径
disk[k] = Weight;
path[k] = m;//记录该站点的前驱站点
}
}
else
{//若需要换乘
if (Weight + 5 < disk[k])
{//路径长度需额外加5,即中途换乘站的换乘耗时
disk[k] = Weight + 5;
path[k] = m;//记录该站点的前驱顶点
}
}
}
}
}
}
int leastchange(int start, int end)//寻找最少换乘次数的方案
{
for (int i = 0; i < nowsum; i++)
{
for (int j = 0; j < nowsum; j++)
{
for (int k = 0; i != j && k <= sta[nowsum].tag; k++)
{//通过比较所属线路名称确认两个站点的关系
if (!strcmp(sta[i].Line[0], sta[j].Line[k]) || !strcmp(sta[i].Line[1], sta[j].Line[k]) || !strcmp(sta[i].Line[2], sta[j].Line[k]))
adj[i][j].inaline = adj[j][i].inaline = 1;//如果二者在同一条线上,inaline设为1
}
}
}
int disk1[NUM];
for (int i = 0; i < nowsum; i++)
{//初始化辅助数组
s[i] = 0;
disk1[i] = adj[start][i].inaline;
path[i] = start;
}
s[start] = 1;//起始站已被添加
disk1[start] = 0;//起始站到自身耗费时间为0
int minweight;
for (int i = 0; i < nowsum - 1; i++)
{//找到未被添加的最小权重值即最短时间的站点
int m = -1, j = 0;
minweight = MAX;
for (j = 0; j < nowsum; j++)//更新辅助数组
{
if (!s[j] && disk1[j] < minweight)
{
minweight = disk1[j];
m = j;//选出从起点站能够直接到达某个站点的所有路径中最短的路径
}
}
s[m] = 1;//标记该站点已找到最短路径
if (m == end)//若已找到到达终点站的最短路径
break;
for (int k = 0; k < nowsum; k++)
{//找出以这条路径作为转发路径到达其他站点的路径
int Weight = minweight + adj[m][k].inaline;
if (!s[k] && Weight < disk1[k])
{
disk1[k] = Weight;
path[k] = m;//记录该站点的前驱站点
}
}
}
for (int i = 0; i < nowsum; i++)//重新初始化辅助数组
s[i] = 0;
s[start] = 1;//起始站已被添加
int m = disk1[end];
int k = end, p = path[end];
while (m - 1)
{
for (int j = 0; j < nowsum; j++)
{
if (!s[j] && disk1[j] == m - 1 && j != p)
path[j] = start;
}
m--;
k = p;
p = path[k];
}
m = disk1[end], k = end;
while (m)
{
int t = path[k];//找到终点站的前驱站点
s[k] = 0;
p = path[k];
if (adj[p][k].weight < MAX)
{//即终点站与其前驱站点相邻
s[k] = 1;//标记终点站
k = p;//迭代,将其前驱站点作为新的终点站
p = path[k];
m--;
}
else
{//其前驱站点要经过同线路上的其他站点才能到达终点站
int j = 0;
char r[N];
for (int i = 0; i < sta[k].tag; i++)
{
if (!strcmp(sta[p].Line[0], sta[k].Line[i]) || !strcmp(sta[p].Line[1], sta[k].Line[i]) || !strcmp(sta[p].Line[2], sta[k].Line[i]))
strcpy(r, sta[k].Line[i]);
}
do
{//找到同线路上该前驱站点的相邻站点
bool is = 0;
s[p] = 1;
if (!s[j] && adj[p][j].weight < MAX && !strcmp(adj[p][j].line, r))
{
s[j] = 1;//标记相邻站点
path[j] = p;
is = 1;
}
if (j < nowsum)
{
if (is == 0)
j++;//遍历
else
{
if (j == k)
{//直到到达终点站,终止循环
k = t;
j = nowsum;
}
else
{//找到相邻站点后迭代
p = j;
j = 0;
}
}
}
else
{//遍历完毕都没有找到下一个站点,说明该站点是在线路的反方向
p = path[p];//回退到上一个站点
j = 0;
}
} while (j < nowsum);
m--;
}
}
return disk1[end] - 1;//返回换乘次数
}
void subtime(tm* present, int start, int end)//计算下一趟地铁到达出发站的时间
{
bool date = 0;//是否为周末
int hour = present->tm_hour;//小时,取值范围为[0,23]
int minute = present->tm_min;//分钟,取值范围为[0,59]
if (present->tm_wday == 0 || present->tm_wday == 6)//星期几,取值范围为[0,6]
date = 1;
else
date = 0;
int k = start, p = popft();//出发站和出发站的下一站
int spend = 0;//地铁从首站到用户规定的出发站所要耗费的时间
int First = -1;//时间表数组下标
for (int i = 0; i < nowsum; i++)
s[i] = 0;//初始化辅助数组
for (int i = 0; i < nowtimesum; i++)
{//寻找时间表的大循环
if (!strcmp(adj[k][p].line, tt[i].lines) && tt[i].isweekend == date)
{//寻找起始线路对应时间(工作日或周末)的时间表
First = i;//记录时间表位置
s[search(tt[i].firststa)] = 1;//标记首站
int j = search(tt[i].nextsta);//首站的下一站,表示方向
spend += adj[search(tt[i].firststa)][j].weight;
for (int r = 0; r < nowsum; r++)
{//累加时间的小循环
if (!s[r] && adj[j][r].weight < MAX && !strcmp(adj[j][r].line, tt[i].lines))
{//寻找该线路上的下一站
s[r] = 1;//标记
spend += adj[j][r].weight;
if (r == k)
{//到达出发站,终止小循环和大循环
i = nowtimesum;
break;
}
if (r == p)
{//先到达出发站的下一站,说明方向相反,终止小循环
spend = 0;
break;
}
j = r;
r = 0;//迭代
}
}
}
}
while (topft >= 0)
popft();//清空栈
if (First == -1)
{//没有该线路对应的时间表
cout << "(线路暂无起点站发车时间表,若需要知道下一趟地铁到达时间,请询问相关工作人员)" << endl;
return;
}
int j;
for (j = 0; j < 60; j++)
{
if (tt[First].exacttime[hour - 1][j] && j + spend >= minute + 60)
{//上个小时出发的地铁发车时间(分)加上从首站到出发站的时间需大于等于现在的时间(分)+60
cout << "下一趟地铁预计将在" << hour << "时" << j + spend - 60 << "分到达出发站,请做好准备" << endl;
break;//例:11:55出发的车运行10分钟能让12:03到达站台的用户乘坐,55+10>03+60
}
}
if (j == 60)
{
for (j = 0; j < 60; j++)
{
if (tt[First].exacttime[hour][j] && j + spend >= minute)
{//这个小时出发的地铁发车时间(分)加上从首站到出发站的时间需大于等于现在的时间(分)
cout << "下一趟地铁预计将在" << hour << "时" << j + spend << "分到达出发站,请做好准备" << endl;
break;//例:12:00出发的车运行10分钟能让12:08到达站台的用户乘坐,00+10>08
}
}
}
if (j == 60)
{
for (j = 0; j < 60; j++)
{
if (tt[First].exacttime[hour + 1][j] && j + spend >= minute - 60)
{//下个小时出发的地铁发车时间(分)加上从首站到出发站的时间需大于等于现在的时间(分)-60
cout << "下一趟地铁预计将在" << hour + 1 << "时" << j + spend << "分到达出发站,请做好准备" << endl;
break;//例:13:00出发的车运行5分钟能让12:59到达站台的用户乘坐,00+5>59-60
}
}
}
if (j == 60)//说明现在不是这趟地铁的运行时间
cout << "(当前非该趟列车运行时间,请更换出行方式)";
}
void print(int start, int end, int k, int p)//打印结果
{
int last = start;//保存上一站
int n = 1;//记录已乘坐的站数
int next = pop();//栈顶元素,表示下一站
char LINE[N];//线路名称
int totaltime = 0;//总时间
int totaldistance = 0;//总距离
totaltime += adj[last][next].weight;
totaldistance += adj[last][next].distance;
strcpy(LINE, adj[last][next].line);
if (p == 1)
cout << "最短时间的方案:";
else
cout << "最少换乘次数的方案:";
cout << "(乘坐" << LINE << "线)" << sta[start].station << "->";//打印起始线路和起点站
last = next;//更新上一站
while (!empty())//迭代直到栈空
{
next = pop();
if (strcmp(LINE, adj[last][next].line) != 0)//需要换乘
{//将每一次last和next对应站点的权重即时间相加,并额外加上每次换乘消耗的5分钟,得到总时间
totaltime += adj[last][next].weight + k * 5;
totaldistance += adj[last][next].distance;//将每一次last和next对应站点的距离相加得到总距离
strcpy(LINE, adj[last][next].line);//打印乘坐站数和此换乘
cout << "(换乘" << LINE << "线)" << sta[last].station << "->";
}
else
{
totaltime += adj[last][next].weight;
totaldistance += adj[last][next].distance;
cout << sta[last].station << "->";
}
last = next;//更新上一站
}
cout << sta[end].station << endl;
int price = 0;//由总距离得到总价格
if (totaldistance <= 6000)
price = 3;
else
{
if (totaldistance <= 12000)
price = 4;
else
{
if (totaldistance <= 22000)
price = 5;
else
if (totaldistance <= 32000)
price = 6;
else
price = ceil((totaldistance - 32000) / 20000) + 6;
}
}
cout << "总距离为" << totaldistance << "米,总时间为" << totaltime << "分钟,费用为" << price << "元" << endl;
time_t nowtime;
time(&nowtime);//获取1970年1月1日0点0分0秒到现在经过的秒数
tm* present = localtime(&nowtime);//转换为本地时间
subtime(present, start, end);//计算到站时间
}
void program(int n)//查询线路
{
int start, end;
char startname[N], endname[N];
cout << "请输入起始站名和终点站名,两站之间用回车分开" << endl;//输入起始站和终点站
cin >> startname;
cin >> endname;
cout << endl;
start = search(startname);//查找起点站在地铁站点数组中的下标
end = search(endname);//查找终点站在地铁站点数组中的下标
int k = 0;
if (n == 1)
dijkstra(start, end);//查询换乘
else
k = leastchange(start, end);//查询换乘
topft = top;
for (int i = end; i != start; i = path[i])
push(i);//路径追溯
for (int i = end; i != start; i = path[i])
pushft(i);//路径追溯
print(start, end, k, n);//打印结果
}
void add()//添加线路
{
char linename[N];//每条线路的名称
int sum;//每条线路的站数
int speed;//每条线路的平均速度
cin >> linename >> sum;
strcpy(subname[nowsub++], linename);
cin >> speed;
int last = -1;//上一站,表示现在的站是否为线路起点站
int resum = sum;
int position[NUM] = { 0 };//记录站点位置
while (sum)//循环读取站点
{
char name[N];//站点名称
bool ischange;//站点换乘状态
int Distance;//两站间距离
cin >> name >> ischange >> Distance;
if (search(name) == -1)//若该站点是第一次出现
{
strcpy(sta[nowsum].station, name);
sta[nowsum].change = ischange;
strcpy(sta[nowsum].Line[sta[nowsum].tag++], linename);
if (last != -1)//非线路起始站
{
strcpy(adj[last][nowsum].line, linename);
strcpy(adj[nowsum][last].line, linename);
adj[last][nowsum].distance = adj[nowsum][last].distance = Distance;
adj[last][nowsum].weight = adj[nowsum][last].weight = round(Distance / speed) + 1;
}//+1是地铁在每一站停留的时间
last = nowsum;//更新上一站
position[sum] = last;
nowsum++;//更新站点总数
}
else//若该站点已存在
{
sta[search(name)].change = ischange;
strcpy(sta[search(name)].Line[sta[search(name)].tag++], linename);
if (last != -1)//非线路起始站
{
strcpy(adj[last][search(name)].line, linename);
strcpy(adj[search(name)][last].line, linename);
adj[last][search(name)].distance = adj[search(name)][last].distance = Distance;
adj[last][search(name)].weight = adj[search(name)][last].weight = round(Distance / speed) + 1;
}//+1是地铁在每一站停留的时间
last = search(name);//更新上一站
position[sum] = last;
}
sum--;
}
cout << endl;
cout << linename << "线 共" << resum << "个站" << endl;
for (int i = resum; i > 0; i--)
{
if (sta[position[i]].change == 1)//是换乘站
cout << sta[position[i]].station << "(换乘站)->";
else//非换乘站
cout << sta[position[i]].station << "->";
}
char back = 8;//回退两格,删除多余的一个"->"
cout << back << back << " " << endl;
}
void omit()//删除线路
{
char ch[N];//线路名称
cin >> ch;
for (int i = 0; i < nowsub; i++)
{//在线路数组中删除线路
if (!strcmp(subname[i], ch))
{//寻找该线路位置
while (i < nowsub)
{//其后的线路依次复制到前一个位置,覆盖掉该线路
strcpy(subname[i], subname[i + 1]);
i++;
}
strcpy(subname[i], "");//删除最后一个站点(已被复制到前一个位置)
nowsub--;//地铁线路数减一
break;
}
}
for (int i = 0; i < nowsum; i++)
{//在站点数组和地铁图中删除站点
for (int j = 0; j < sta[i].tag; j++)
{
if (!strcmp(sta[i].Line[j], ch))
{//在站点数组中找到该线路上的站点
if (sta[i].tag == 1)
{//如果站点只属于该线路
sta[i].tag--;//删除线路信息
strcpy(sta[i].Line[0], "");
for (int k = 0; k < nowsum; k++)
{//更新地铁图
strcpy(adj[i][k].line, "");
adj[i][k].weight = adj[k][i].weight = adj[i][k].distance = adj[k][i].distance = MAX;
}
}
else
{//如果站点也属于其他线路
sta[i].tag--;
if (j == 5)//存储在最后一个位置
strcpy(sta[i].Line[5], "");
else
{//其后的线路依次复制到前一个位置,覆盖掉该线路
for (int k = 5; k > j; k--)
strcpy(sta[i].Line[k - 1], sta[i].Line[k]);
j--;//往后寻找是否还有该线路
}
}
}
}
}
for (int i = 0; i < nowsum; i++)
{//遍历地铁图
for (int j = 0; j < nowsum; j++)
{
if (!strcmp(adj[i][j].line, ch))
{//删除线路信息并最大化权重和距离
strcpy(adj[i][j].line, "");
adj[i][j].weight = adj[i][j].distance = MAX;
}
}
}
}
void alter(int n)//编辑线路
{
if (n == 1)
{
cout << "请按如下格式输入:" << '\n' << "线路名称 站点个数" << '\n' << "地铁运行平均速度(单位为米/分)" << endl;
cout << "站点名称 是否为换乘站(是输1,否输0) 上一站到该站的距离(单位为米,最先输入的站点为0)" << endl;
cout << "(每一行输入一个站点,不得超过" << NUM - nowsum << "个站点,不支持原本在一条线路上的相邻两站在新线路上也相邻的情况)" << endl << endl;
cout << "示例如下:" << '\n' << "3号 3" << '\n' << "667" << '\n' << "第1个站 0 0" << '\n' << "第2个站 1 1000" << '\n' << "第3个站 0 1000" << endl << endl;
add();//添加线路
}
else
{
cout << "请选择要删除的线路(完整输入)" << endl;
for (int i = 0; i < nowsub; i++)
cout << subname[i] << ' ';
cout << endl;
omit();//删除线路
}
}
};
int main()
{
freopen("地铁线路数据.txt", "r", stdin);//打开文件读取内容
int SUM;//地铁线路总数
cin >> SUM;
subway sub;
sub.create(SUM);//创建地铁图
cin.clear();//更改cin的状态标示符
freopen("CON", "r", stdin);//将标准输入重定向为 CON 控制台
freopen("CON", "w", stdout);
sub.creattimetable();//创建时间表
cout << "此为北京地铁线路查询系统:" << endl;//交互界面
cout << "1.查询线路" << endl;
cout << "2.编辑线路" << endl;
cout << "3.退出系统" << endl;
cout << "请输入数字:" << endl;
int n;
cin >> n;
if (n == 3)
return 0;
do//用户不输入3就一直循环
{
if (n == 1)
{
cout << "请选择需求原则:" << endl;
cout << "1.最短时间" << endl;
cout << "2.最少换乘次数" << endl;
cout << "3.退出系统" << endl;
cout << "请输入数字:" << endl;
int n1;
cin >> n1;
if (n1 == 3)
return 0;
sub.program(n1);//查询线路
}
else
{
cout << "请选择操作内容:" << endl;
cout << "1.添加线路" << endl;
cout << "2.删除线路" << endl;
cout << "3.退出系统" << endl;
cout << "请输入数字:" << endl;
int n2;
cin >> n2;
if (n2 == 3)
return 0;
sub.alter(n2);//编辑线路
}
cout << endl;
cout << "1.查询线路" << endl;
cout << "2.编辑线路" << endl;
cout << "3.退出系统" << endl;
cout << "请输入数字:" << endl;
cin >> n;
} while (n != 3);
return 0;
}