-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
157 lines (133 loc) · 5.46 KB
/
main.cpp
File metadata and controls
157 lines (133 loc) · 5.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
广州地铁
*/
#include <iostream>
#include <string>
#include "Metrograph.hpp"
#include "Pathfind.hpp"
#include "Statistics.hpp"
const char* RED_TEXT = "\033[1;31m";
const char* RESET_TEXT = "\033[0m";
bool init(MetroGraph& g){
std::cout << "================================================" << "\n";
std::cout << "正在加载广州地铁路线图" << "\n";
if (g.LoadGraph("MetroNetwork.txt")) {
std::cout << "加载成功!" << "\n";
std::cout << "当前共收录站点数:" << g.GetTotalStation() << "\n";
return true;
}
else {
std::cout << "加载失败,请检测输入文件是否存在或在同一目录下" << "\n" ;
return false;
}
std::cout << "================================================" << "\n";
}
void printmenu(){
std::cout << "\n===========广州地铁智能引导系统 ==========\n";
std::cout << "1. 路线查询\n";
std::cout << "2. 线路管理 (关闭/恢复)\n";
std::cout << "3. 演示 [故障触发重算] (Check Requirement 5)\n";
std::cout << "4. 查看热门站点统计 (Top-K)\n";
std::cout << "0. 退出\n";
std::cout << "=============================================\n";
std::cout << "请选择功能 > ";
}
int main(){
system("chcp 65001");
//std::ios::sync_with_stdio(false);
//std::cin.tie(nullptr); std::cout.tie(nullptr);
MetroGraph CityMetro;
if (!init(CityMetro)){
system("pause");return -1;
}
PathFind finder(&CityMetro);
Statistics stats;
stats.Init(CityMetro.GetTotalStation());
while (1 == 1){
printmenu();
int choice;
if (!(std::cin >> choice)) break; // 防止输入错误死循环
if (choice == 0) break;
// --- 1. 路线查询 ---
else if (choice == 1) {
std::string s_name, e_name, mode_in;
std::cout << "输入: [起点] [终点] [偏好(1=快/2=少换乘/3=舒适)]\n> ";
std::cin >> s_name >> e_name >> mode_in;
int u = CityMetro.GetID(s_name);
int v = CityMetro.GetID(e_name);
if (u != -1 && v != -1) {
// 更新统计
stats.Update(u);
stats.Update(v);
std::string mode = "最快";
if (mode_in == "2") mode = "最少换乘";
if (mode_in == "3") mode = "舒适度优先";
if (finder.dijkstra(u, v, mode)) {
finder.PrintPath(u, v);
}
} else {
std::cout << "站点不存在\n";
}
}
// --- 2. 线路管理 ---
else if (choice == 2) {
int line, op;
std::cout << "请输入操作: [1=关闭线路] [2=恢复线路] \n> ";
std::cin >> op;
std::cout << "请输入线路号 (如 1): ";
std::cin >> line;
CityMetro.SetLineStatus(line, (op == 2));
}
// --- 3. 故障重算演示 (高亮差异) ---
// --- 3. 故障重算演示 (高亮差异) ---
else if (choice == 3) {
// 1. 先让用户选要炸哪条线
int broken_line;
std::cout << "请输入要模拟故障的线路号 (例如 1, 2, 5): ";
std::cin >> broken_line;
std::string s_name = "西塱";
std::string e_name = "公园前";
int u = CityMetro.GetID(s_name);
int v = CityMetro.GetID(e_name);
if(u == -1 || v == -1) { std::cout << "演示失败:默认站点不存在\n"; continue; }
// 正常算路
std::cout << "\n[阶段一] 线路正常时:\n";
// 确保这条线一开始是通的
CityMetro.SetLineStatus(broken_line, true);
finder.dijkstra(u, v, "最快");
std::string old_path = finder.GetPathString(u, v);
std::cout << "原路径: " << old_path << "\n";
// 模拟故障
std::cout << "\n[阶段二] 突发: " << broken_line << " 号线故障停运!\n";
CityMetro.SetLineStatus(broken_line, false);
// 重算
std::cout << ">>> 正在重算...\n";
finder.dijkstra(u, v, "最快");
std::string new_path = finder.GetPathString(u, v);
if (old_path != new_path) {
std::cout << "检测到路径变更!\n";
std::cout << "新路径: ";
std::cout << RED_TEXT << new_path << RESET_TEXT << "\n";
}
else {
std::cout << "路径未受影响 (原路径未经过该线路,或无替代路)。\n";
}
// 演示完记得恢复,不然影响后面查询
CityMetro.SetLineStatus(broken_line, true);
std::cout << "(演示结束,已自动恢复 " << broken_line << " 号线)\n";
}
// --- 4. 统计 Top-K ---
else if (choice == 4) {
stats.PrintTopK(3, &CityMetro);
}
// --- 5. 客流预测 ---
else if (choice == 5) {
CityMetro.SimulateFlow(); // 模拟生成数据
int t;
std::cout << "查询未来第几分钟 (1-30): ";
std::cin >> t;
CityMetro.PrintCrowdTopK(t, 5);
}
}
return 0;
}