# 代码概述
你要求将南京公交的 **2路、11路、66路、146路** 的完整站点信息重新加入系统,且 **清空所有原有数据**,并从 ID 编号 1 开始顺序分配。这属于对程序进行彻底的数据初始化任务。
我们将:
- 忽略之前的所有默认站点
- 为每一条线路中的每一个站点分配唯一的递增整数 ID(从 1 开始)
- 构建完整的 `stationNameToId` 和 `stationIdToName` 映射
- 将每条线路按方向存储(双向可能略有不同)
- 在程序启动时加载这些数据到 `routes` 和 `graph`
---
# 代码解析
## ✅ 第一步:提取所有不重复站点并编号(去重 + 顺序编号)
我们先整理所有涉及的站点,并去除完全相同的名称(注意部分站名方向标注不同,如“龙蟠路・岗子村”和“龙蟠路・岗子村(北站台)”视为不同站)。
> 我们会将所有站点统一归一化处理(保留原名),并从 `ID = 1` 起连续编号。
### 所有唯一站点列表(共 98 个)
| ID | 站点名称 |
|----|----------|
| 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 | 草场门大桥东(1 站台) |
| 30 | 北京西路・草场门 |
| 31 | 江苏省委 |
| 32 | 玉泉路 |
| 33 | 北京西路・云南路 |
| 34 | 鼓楼公园 |
| 35 | 北京东路・进香河路 |
| 36 | 北京东路・兰园 |
| 37 | 板仓街・岗子村(2 站台) |
| 38 | 板仓村 |
| 39 | 钟麓花园 |
| 40 | 板仓街・花园路 |
| 41 | 樱驼村 |
| 42 | 蒋王庙(皮研所) |
| 43 | 樱花路 |
| 44 | 樱驼花园 |
| 45 | 经五立交 |
| 46 | 墨香山庄西 |
| 47 | 兴贤佳园西 |
| 48 | 万兴路南 |
| 49 | 壹城 |
| 50 | 万兴路・迈化路 |
| 51 | 万寿地铁站南 |
| 52 | 燕城大道・寅春西路 |
| 53 | 神农路桥 |
| 54 | 神农路・燕城大道 |
| 55 | 燕江新城总站 |
| 56 | 神农路・壮举路 |
| 57 | 草场门大桥东(2 站台) |
| 58 | 虎踞北路・草场门 |
| 59 | 古林公园 |
| 60 | 古平岗 |
| 61 | 镇江路 |
| 62 | 丁山宾馆 |
| 63 | 双门楼宾馆 |
| 64 | 盐仓桥 |
| 65 | 长平桥西 |
| 66 | 长平桥东 |
| 67 | 民生街(金桥装饰城) |
| 68 | 城河村 |
| 69 | 金桥市场 |
| 70 | 中央门东(东站台) |
| 71 | 龙蟠路・南京站西 |
| 72 | 龙蟠路・南京站东 |
| 73 | 新庄广场西 |
| 74 | 新庄广场北 |
| 75 | 曹后村 |
| 76 | 红山路・华跃路 |
| 77 | 红山森林动物园 |
| 78 | 十字街 |
| 79 | 省中西医结合医院 |
| 80 | 迈皋桥东(1 站台) |
| 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 | 南京邮电大学(1 站台) |
| 112 | 羊山北路西 |
| 113 | 羊山北路总站 |
> 共计 **113 个站点**
---
## ✅ 第二步:在 `main()` 函数中替换初始化逻辑
删除原来的所有默认数据,在 `loadRoutesFromFile()` 后添加以下代码:
```cpp
// 清空旧数据,从头开始构建
stationNameToId.clear();
stationIdToName.clear();
routes.clear();
graph.clear();
// 定义所有站点映射(ID: 名称)
vector<string> allStations = {
"墨香路总站", "樱铁村", "玄武大道・长途东站", "新庄广场东", "新庄广场南",
"锁金村", "龙蟠路・岗子村", "太平门", "北京东路・九华山", "太平北路・鸡鸣寺",
"四牌楼", "大行宫北", "网巾市", "青石街", "羊皮巷", "内桥", "内桥南",
"中华路・三山街", "中华路・瞻园路", "中华门城堡(南站台)", "大报恩寺遗址公园(建初寺)", "中华门地铁站",
"应天大街・雨花路", "中华门城堡(北站台)", "中华路・长乐路", "新街口・正洪街",
"龙江新城市广场", "龙江小区", "草场门大桥东(1 站台)", "北京西路・草场门",
"江苏省委", "玉泉路", "北京西路・云南路", "鼓楼公园", "北京东路・进香河路",
"北京东路・兰园", "板仓街・岗子村(2 站台)", "板仓村", "钟麓花园", "板仓街・花园路",
"樱驼村", "蒋王庙(皮研所)", "樱花路", "樱驼花园", "经五立交", "墨香山庄西",
"兴贤佳园西", "万兴路南", "壹城", "万兴路・迈化路", "万寿地铁站南", "燕城大道・寅春西路",
"神农路桥", "神农路・燕城大道", "燕江新城总站", "神农路・壮举路", "草场门大桥东(2 站台)",
"虎踞北路・草场门", "古林公园", "古平岗", "镇江路", "丁山宾馆", "双门楼宾馆",
"盐仓桥", "长平桥西", "长平桥东", "民生街(金桥装饰城)", "城河村", "金桥市场",
"中央门东(东站台)", "龙蟠路・南京站西", "龙蟠路・南京站东", "新庄广场西",
"新庄广场北", "曹后村", "红山路・华跃路", "红山森林动物园", "十字街", "省中西医结合医院",
"迈皋桥东(1 站台)", "长营村", "北苑新村", "月苑小区北", "营苑北路东", "万寿总站",
"和平公园", "北京东路・鼓楼", "四平路广场南", "古平岗南", "仙林中心站(东站台)",
"学典路・文苑路", "学典路", "仙林中心站", "杉湖西路", "学津路", "文枢东路",
"学衡路・亚东新城区", "亚东新城区", "文苑路西", "仙隐北路", "雁鸣山庄",
"仙隐北路・鹤鸣路", "尧胜村", "徐庄软件园东", "徐庄软件园", "东杨坊", "聚宝山地铁站",
"王家湾", "伊刘邨", "月苑南路(东站台)", "南京邮电大学(1 站台)", "羊山北路西", "羊山北路总站"
};
for (int i = 0; i < allStations.size(); ++i) {
int id = i + 1; // 从1开始编号
string name = allStations[i];
stationIdToName[id] = name;
stationNameToId[name] = id;
}
```
---
## ✅ 第三步:定义各线路路径(使用 ID 列表)
### 2路 往中华门地铁站方向
```cpp
vector<int> line2_forward = {
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22
};
routes["2路"] = line2_forward;
```
> 注意:反向路线与正向不完全一致,若需支持可另存为 `2路_返程` 或合并为双向边自动连通。
### 11路 往燕江新城总站方向
```cpp
vector<int> line11_forward = {
27,28,29,30,31,32,33,34,35,36,9,8,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55
};
routes["11路"] = line11_forward;
```
### 66路 往万寿总站方向
```cpp
vector<int> line66_forward = {
27,28,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,48,49,50,85
};
routes["66路"] = line66_forward;
```
### 146路 往月苑南路(东站台)方向
```cpp
vector<int> line146_forward = {
113,112,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,45,110
};
routes["146路"] = line146_forward;
```
---
## ✅ 第四步:构建图结构(双向连接)
在所有线路添加完毕后,执行建图逻辑:
```cpp
for (const auto& route : routes) {
const vector<int>& stations = route.second;
for (size_t i = 0; i < stations.size() - 1; ++i) {
int u = stations[i];
int v = stations[i+1];
string rName = route.first;
graph[u].push_back(Edge(v, 5, rName));
graph[v].push_back(Edge(u, 5, rName)); // 双向通行
}
}
```
---
## ✅ 可选:写入文件持久化(推荐)
创建 `bus_routes.txt` 文件内容如下:
```txt
# route_name station_id_sequence
2路 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
11路 27 28 29 30 31 32 33 34 35 36 9 8 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
66路 27 28 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 48 49 50 85
146路 113 112 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 45 110
```
并在 `main()` 中调用 `loadRoutesFromFile();` 后动态生成站点映射即可实现热加载。
---
# 知识点
**1. 数据去重与顺序编号**
通过遍历所有线路提取唯一站点,实现从 1 开始连续编号,便于后续建模。
**2. 双向图构建策略**
即使线路为单向运营,在图中仍建立双向边以支持往返查询(可根据需求调整)。
**3. 字符串与 ID 映射管理**
利用 `map<string, int>` 和 `map<int, string>` 实现高效名称↔ID转换,避免硬编码。