博客
关于我
1131 Subway Map
阅读量:420 次
发布时间:2019-03-06

本文共 2276 字,大约阅读时间需要 7 分钟。

这道题目要求我们根据输入的北京地铁线路数据,找到用户的起始位置到目标位置的最短换乘次数,并输出最优路径。我们可以通过广度优先搜索(BFS)计算最短路径,然后用深度优先搜索(DFS)重建路径,最后输出结果。

思路总结

  • 数据建模:将地铁线路转换为无权图的邻接表,每个站点作为图中的节点,线路作为边。
  • 广度优先搜索(BFS):用于计算从起始位置到所有其他节点的最短换乘次数,并记录每个节点的前驱节点。
  • 深度优先搜索(DFS):根据前驱节点重建最短路径,确保路径是换乘次数最少的。
  • 路径输出:将路径转换为用户友好的字符串格式,仅输出中间转换站。
  • 解决代码

    #include 
    using namespace std;
    unordered_map
    lines;
    vector
    > trans, tempTrans;
    vector
    grap[10005], past[10005], path, temp, dis(10005);
    int n, m, k, start, dest;
    void BFS() {
    queue
    que; for (int i = 0; i < 10005; ++i) { past[i].clear(); dis[i] = INT_MAX; } que.push(start); dis[start] = 0; while (!que.empty()) { int q = que.front(); que.pop(); if (dis[q] > dis[dest]) continue; for (int g : grap[q]) { if (dis[g] >= dis[q] + 1) { if (dis[g] == INT_MAX) { que.push(g); } dis[g] = dis[q] + 1; if (dis[g] > dis[q] + 1) { past[g].clear(); } past[g].push_back(q); } } } } void DFS(int d) { path.push_back(d); if (d == start) { tempTrans.clear(); tempTrans.push_back({start, -1}); for (int i = path.size() - 2; i > 0; --i) { if (lines[path[i + 1] * 10000 + path[i]] != lines[path[i] * 10000 + path[i - 1]]) { tempTrans.push_back({path[i], lines[path[i] * 10000 + path[i + 1]]}); } } } tempTrans.push_back({dest, lines[path[1] * 10000 + dest]}); if (trans.size() > tempTrans.size() || trans.size() == 0) { trans = tempTrans; } for (int p : past[d]) { DFS(p); } path.pop_back(); } int main() { cin >> n; for (int i = 1; i <= n; ++i) { cin >> m; vector
    temp(m); for (int j = 0; j < m; ++j) { cin >> temp[j]; } for (int j = 1; j < m; ++j) { int s1 = temp[j]; int s2 = temp[j - 1]; lines[s1 * 10000 + s2] = i; lines[s2 * 10000 + s1] = i; grap[s1].push_back(s2); grap[s2].push_back(s1); } } cin >> k; for (int i = 0; i < k; ++i) { cin >> start >> dest; BFS(); path.clear(); trans.clear(); DFS(dest); cout << dis[dest] << endl; for (int i = 0; i < trans.size() - 1; ++i) { printf("Take Line#%d from %04d to %04d.\n", trans[i + 1].second, trans[i].first, trans[i + 1].first); } } return 0; }

    代码解释

  • 数据读取与建模:读取输入数据,构建邻接表grap和线路映射lines,记录每个站点所属的线路。
  • BFS算法:从起始点出发,计算每个站点的最短换乘次数,并记录前驱节点。
  • DFS重建路径:使用前驱节点逆向遍历,重建最短路径,并记录每次换乘的线路号。
  • 结果输出:输出最短换乘次数和路径字符串,确保只显示中间转换站。
  • 通过以上步骤,可以高效地解决问题并输出符合要求的最短路径。

    转载地址:http://yntuz.baihongyu.com/

    你可能感兴趣的文章
    Openlayers实战:绘制多边形,导出CSV文件
    查看>>
    Openlayers实战:绘制带箭头的线
    查看>>
    Openlayers实战:绘制点、线、圆、多边形
    查看>>
    Openlayers实战:绘制矩形,正方形,正六边形
    查看>>
    Openlayers实战:自定义放大缩小,显示zoom等级
    查看>>
    Openlayers实战:自定义版权属性信息
    查看>>
    Openlayers实战:输入WKT数据,输出GML、Polyline、GeoJSON格式数据
    查看>>
    Openlayers实战:选择feature,列表滑动,定位到相应的列表位置
    查看>>
    Openlayers实战:非4326,3857的投影
    查看>>
    Openlayers高级交互(1/20): 控制功能综合展示(版权、坐标显示、放缩、比例尺、测量等)
    查看>>
    Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
    查看>>
    Openlayers高级交互(11/20):显示带箭头的线段轨迹,箭头居中
    查看>>
    Openlayers高级交互(12/20):利用高德逆地理编码,点击位置,显示坐标和地址
    查看>>
    Openlayers高级交互(13/20):选择左右两部分的地图内容,横向卷帘
    查看>>
    Openlayers高级交互(14/20):汽车移动轨迹动画(开始、暂停、结束)
    查看>>
    Openlayers高级交互(15/20):显示海量多边形,10ms加载完成
    查看>>
    Openlayers高级交互(16/20):两个多边形的交集、差集、并集处理
    查看>>
    Openlayers高级交互(17/20):通过坐标显示多边形,计算出最大幅宽
    查看>>
    Openlayers高级交互(18/20):根据feature,将图形适配到最可视化窗口
    查看>>
    Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
    查看>>