最优乘车问题/dijsktra最短路径算法

本文介绍了一种寻找从起点到终点最少换乘次数的公交路线算法。通过将公交线路视为图中的边,利用图算法来解决实际问题。具体实现包括初始化图结构、读取线路信息并构建图,最后通过优化路径确定最少换乘次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

H城是一个旅游胜地,每年都有成千上万的人前来观光.为方便游客,巴士公司在各个旅游景点及宾馆、饭店等地都设置了巴士站,并开通了一些单向巴士线路。每条单向巴士线路从某个巴士站出发,依次途径若干个巴士站,最终到达终点巴士站。

阿昌最近到H城旅游,住在CUP饭店。他很想去S公园游玩。听人说,从CUP饭店到S公园可能有也可能没有直通巴士。如果没有,就要换乘不同线路的单向巴士,还有可能无法乘巴士到达。现在用整数1,2,...,n给H城的所有巴士站编号,约定CUP饭店的巴士站编号为1,S公园巴士站的编号为N。写一个程序,帮助阿昌寻找一个最优乘车方案,使他在从CUP饭店到S公园的过程中换车的次数最少。

车站:1    2    3    4    5

第一条路线:1 2 3 5

第二条路线:1 4

第三条路线:4 5

则直接选择第一条路线,换车次数最少为0

输入

第1行是一个数字M(1≤M≤100)表示开通了M条单向巴士线路,第2行是一个数字N(1<N≤500),表示共有N个车站。从第3行到第M+2行依次给出了第一条到第M条巴士线路的信息。其中第i+2行给出的是第i条巴士线路的信息,从左至右依次按行行驶顺序给出了该线路上的所有站点,相邻两个站号之间用一个空格隔开。 

输出

为最少换车次数(在0,1,…,M-1中取值),0表示不需换车即可达到。如果无法乘车达到S公园,则输出"NO"。

样例输入

2
5
1 4
2 3 4 5

样例输出

1

该题可将一趟公交车经过的站点看成一张图中连通的顶点,且站台之间的距离都为1。每换乘一次会必会使得路径长度加1(因为换乘的目的就是向终点站靠近,所以换乘后的公交到达的最远站点序号必定大于换乘前能到达的最远序号,又由于第一次换乘前至少搭过一个站点(每趟公交至少经过两个站点否则无法换乘),即初始路径为1,所以有:换乘数 = 路径-1

如:样例中 1 - 4的距离为1,2-3,2-4,2-5,3-4,4-5 的距离均为1。第一条公交:1->4,路径 = 1,换乘到第二条公交:4->5,路径 = 2。换乘数 = 路径 - 1 = 1

代码:

#include<stdio.h>
#include<string.h>
#define MAX 155
#define inf 0x3f3f3f

int map[MAX][MAX];
int dist[MAX];
bool flag[MAX];
int n,m;

void fun(int start);
int main()
{
    memset(map,inf,sizeof(int)*MAX*MAX);
    scanf("%d%d",&m,&n);
    char c;
    int len;
   while(m--)
    {
        c=1;
         len=0;
        while ((c!=-1)&&(c!='\n'))
        {
              scanf("%d",&dist[++len]);
              c=-1;
              scanf("%c",&c);
        }
        for (int j=1;j<=n;++j)
            for (int k=j+1;k<=n;++k)
                map[dist[j]][dist[k]]=1;
    }
   fun(1);
   if(map[1][n]==inf)
    printf("NO\n");
   else
    printf("%d\n",map[1][n]-1);

    return 0;
}
void fun(int start)
{
    flag[start] = true;

   for(int i = 1 ; i<=n ; i++)
    {
        int temp = start;
        int min = inf;
        for(int i = 1 ; i<=n ; i++)
        {
            if(!flag[i]&&map[start][i]<min)
            {
                min = map[start][i];
                temp = i;
            }
        }
        flag[temp] = true;
        for(int i = 1 ; i<=n ; i++)
        {
            if(!flag[i]&&map[start][temp]<inf)
            if(map[start][i]>map[start][temp]+map[temp][i])
                map[start][i] = map[start][temp]+map[temp][i];
        }
    }
}

 

 

 

### 使用Dijkstra算法实现上海地铁线路最佳路径规划 #### 路径规划概述 在城市轨道交通系统中,路径规划模块负责根据用户输入的起点和终点站点,计算出最优乘车路径。具体来说,在地铁网络图上应用图搜索算法(如Dijkstra算法),能够有效地找到从起点到终点之间的最短路径[^1]。 #### Dijkstra算法简介 迪杰斯特拉算法是一种用于解决单源最短路径问题的经典贪心算法,适用于无负权重边的情况。此方法采用类似于广度优先遍历的方式逐步扩展已知区域直到覆盖整个目标节点集,并在此过程中维护一个当前最小代价估计表以记录到达各点所需花费的时间或费用等指标值[^3]。 对于上海地铁而言,由于不同线路间的转换通常伴随着额外等待时间开销,因此实际建模时还需考虑这些因素的影响。即当初始化邻矩阵时,除了要考虑到站台间物理距离外,还应该加入换乘所需的固定时间段作为附加成本项一同参与运算过程之中[^4]。 #### 实现方案设计 基于上述理论背景,下面给出一种可能的技术路线: - **数据准备阶段** 构造一张完整的上海市区范围内所有运营中的轻轨/重轨交通设施连情况图表; - **模型建立环节** 将每条轨道线视为独立子网内部署若干个结点代表沿途停靠站点;而跨线交界处则设置虚拟中介体充当公共口完成两部分逻辑上的对操作。 - **核心功能开发方面** 编写一段Python脚本调用第三方库`networkx`辅助快速搭建复杂拓扑关系下的动态路由选择机制框架,再结合自定义业务规则定制化调整参数配置最终达成预期效果展示给终端使用者查看参考之目的。 ```python import networkx as nx from heapq import heappop, heappush def dijkstra(graph, start_node): """执行一次标准版Dijkstra寻路流程""" # 初始化状态容器 visited = set() distances = {node: float('inf') for node in graph.nodes} predecessors = {} priority_queue = [(0, start_node)] while priority_queue: current_distance, current_vertex = heappop(priority_queue) if current_vertex not in visited: visited.add(current_vertex) neighbors = list(graph.neighbors(current_vertex)) for neighbor in neighbors: edge_weight = graph[current_vertex][neighbor]['weight'] distance_through_current = current_distance + edge_weight if distance_through_current < distances[neighbor]: distances[neighbor] = distance_through_current predecessors[neighbor] = current_vertex heappush(priority_queue, (distance_through_current, neighbor)) return distances, predecessors if __name__ == "__main__": G = nx.Graph() edges_with_weights = [ ('A', 'B', {'weight': 7}), ('A', 'C', {'weight': 9}), ... ] G.add_edges_from(edges_with_weights) source_station = "民广场" target_station = "龙阳路" shortest_distances, path_predecessors = dijkstra(G, source_station) optimal_route = [] step = target_station while True: optimal_route.insert(0, step) try: next_step = path_predecessors[step] except KeyError: break step = next_step print(f"From station '{source_station}' to station '{target_station}', the best route is:\n{optimal_route}") ``` 这段代码片段展示了如何创建一个简单的图形对象并通过指定起始位置触发一轮迭代式的最近邻居探测动作直至触及边界条件为止。注意这里仅提供了一个简化版本示意用途,请读者自行补充完善剩余部分使之更贴近真实应用场景需求特点。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值