news 2026/6/15 16:15:59

P1346 电车【洛谷算法习题】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
P1346 电车【洛谷算法习题】

P1346 电车

网页链接

P1346 电车

题目描述

在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能)。在每个路口,都有一个开关决定着出去的轨道,每个开关都有一个默认的状态,每辆电车行驶到路口之后,只能从开关所指向的轨道出去,如果电车司机想走另一个轨道,他就必须下车切换开关的状态。

为了行驶向目标地点,电车司机不得不经常下车来切换开关,于是,他们想请你写一个程序,计算一辆电车从路口A AA到路口B BB,司机最少需要下车切换几次开关。

输入格式

第一行有3 33个整数N , A , B N,A,BN,A,B2 ≤ N ≤ 100 , 1 ≤ A , B ≤ N 2 \leq N \leq 100, 1 \leq A,B \leq N2N100,1A,BN),分别表示路口的数量,和电车的起点,终点。

接下来有N NN行,每行的开头有一个数字K i K_iKi0 ≤ K i ≤ N − 1 0 \leq K_i \leq N-10KiN1),表示这个路口与K i K_iKi条轨道相连,接下来有K i K_iKi个数字表示每条轨道所通向的路口,开关默认指向第一个数字表示的轨道。

输出格式

输出文件只有一个数字,表示从A AAB BB所需的最少的切换开关次数,若无法从A AA前往B BB,输出− 1 -11

输入输出样例 #1

输入 #1

3 2 1 2 2 3 2 3 1 2 1 2

输出 #1

0

解题思路

本题是有向图最短路建模问题,核心是将开关切换次数转化为边权,求解起点到终点的最短路径。
将每个路口视为图的节点,每条出站轨道视为有向边:开关默认指向的第一条轨道无需切换,对应边权为0;选择其余轨道需要切换一次开关,对应边权为1。此时从起点A到终点B的最短路径长度,就是最少需要下车切换开关的次数。
由于节点数量N ≤ 100 N \le 100N100,数据规模极小,采用Floyd 算法求解全源最短路,代码实现简洁直观。初始化邻接矩阵为无穷大,对角线置0;按输入规则构建有向带权图;通过三重循环枚举中间节点,更新所有节点对的最短路径。最终若起点到终点距离仍为无穷大,说明不可达,输出-1;否则输出最短距离。算法时间复杂度O ( N 3 ) O(N^3)O(N3),完全适配题目数据约束。

总结

核心逻辑:把开关切换次数抽象为边权,将实际问题转化为有向图最短路,利用 Floyd 算法高效求解。
关键操作:邻接矩阵初始化、按轨道顺序赋予边权、三重循环执行路径松弛、判断可达性并输出结果。
效率保障:节点数量少,立方级复杂度无运行压力,代码简洁不易出错。

代码简要说明

  1. 矩阵初始化:邻接矩阵g初始化为极大值inf,对角线元素g[i][i]置0,表示节点到自身无需切换开关。
  2. 构建带权图:遍历每个路口的所有出站轨道;第一条轨道边权设为0(默认方向,无需切换),其余轨道边权设为1(需要切换一次)。
  3. Floyd 算法:三重循环结构,外层枚举中转节点k,内层枚举起点i和终点j,用g[i][k] + g[k][j]更新g[i][j]的最小值。
  4. 结果输出:判断起点到终点的距离是否仍为无穷大,是则输出-1表示不可达,否则输出最短切换次数。

代码内容

#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'typedeflonglongll;typedefunsignedlonglongull;typedefvector<vector<ll>>vvt;typedefpair<ll,ll>pll;constll N=1e3+10;constll INF=1e18;constll M=1e6+10;constll mod=1e9+7;constll maxn=100+10;constll inf=1e+8;ll g[maxn][maxn];ll n,m,k,f,t;intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);scanf("%lld%lld%lld",&n,&f,&t);for(ll i=1;i<=n;i++)for(ll j=1;j<=n;j++){g[i][j]=inf;g[i][i]=0;}for(ll i=1;i<=n;i++){scanf("%lld",&k);for(ll j=1;j<=k;j++){ll a;scanf("%lld",&a);if(j==1)g[i][a]=0;elseg[i][a]=1;}}for(ll k=1;k<=n;k++)for(ll i=1;i<=n;i++)for(ll j=1;j<=n;j++)g[i][j]=min(g[i][j],g[i][k]+g[k][j]);if(g[f][t]==inf)puts("-1");elseprintf("%lld",g[f][t]);return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 16:10:19

如何安全解密微信数据库:掌握个人数据的完全控制权

如何安全解密微信数据库&#xff1a;掌握个人数据的完全控制权 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 你是否曾想过&#xff0c;自己微信聊天记录中的宝贵信息被一层加密保护着&#xff0c;无法直…

作者头像 李华
网站建设 2026/6/15 16:08:56

如何快速解锁加密音乐:普通用户的完整音频解密指南

如何快速解锁加密音乐&#xff1a;普通用户的完整音频解密指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https://…

作者头像 李华
网站建设 2026/6/15 16:02:50

零代码本地AI应用搭建:组装式智能体实战指南

1. 项目概述&#xff1a;这不是“教你怎么用ChatGPT”&#xff0c;而是帮你亲手搭出一个能跑在自己电脑上的AI应用“Anyone Can Build GenAI Apps”——这个标题乍看像一句鼓舞人心的口号&#xff0c;但在我过去三年带过27个企业内部AI工作坊、亲手帮零售、制造、教育三类行业客…

作者头像 李华
网站建设 2026/6/15 16:01:38

嵌入式系统可靠性基石:寄存器保护与看门狗定时器原理与实践

1. 项目概述与核心价值在嵌入式系统&#xff0c;尤其是汽车电子和工业控制这类对可靠性要求极高的领域&#xff0c;系统崩溃的代价是巨大的。想象一下&#xff0c;一个正在高速公路上行驶的汽车&#xff0c;其发动机控制单元&#xff08;ECU&#xff09;因为某个关键配置寄存器…

作者头像 李华
网站建设 2026/6/15 15:59:49

New API:企业级AI模型网关的三大核心价值与实战部署指南

New API&#xff1a;企业级AI模型网关的三大核心价值与实战部署指南 【免费下载链接】new-api A unified AI model hub for aggregation & distribution. It supports cross-converting various LLMs into OpenAI-compatible, Claude-compatible, or Gemini-compatible for…

作者头像 李华
网站建设 2026/6/15 15:51:51

山河铸石,风骨传今:从秦汉阴山长城,读懂狼山石的千年人文底蕴

在国风审美持续升温的当下&#xff0c;越来越多人开始偏爱“有故事、有文脉、有沉淀”的天然原石器物。比起市面流水线打造、制式统一的装饰小件&#xff0c;产自北疆阴山的狼山石&#xff0c;凭借独一无二的地质禀赋与厚重的戍边历史背书&#xff0c;成为小众原石圈层里极具人…

作者头像 李华