牛客题解 | 公交车
1.牛客题解 | 5-血型遗传检测2.牛客题解 | 61-递归和动态规划-汉诺塔II3.牛客题解 | Anniversary4.牛客题解 | BST判定5.牛客题解 | CCNumber6.牛客题解 | CIDR去重7.牛客题解 | DNA序列8.牛客题解 | D塔29.牛客题解 | Fibonacci数列10.牛客题解 | K 的倍数11.牛客题解 | Kolakoski 序列12.牛客题解 | LRU Cache13.牛客题解 | LUCKY STRING14.牛客题解 | N-GCD15.牛客题解 | Numeric Keypad16.牛客题解 | Shopee的办公室(二)17.牛客题解 | Spring Outing18.牛客题解 | UTF-8 编码验证19.牛客题解 | Unix路径简化20.牛客题解 | bit count21.牛客题解 | bit位数22.牛客题解 | filename extension23.牛客题解 | geohash编码24.牛客题解 | ipv4地址白名单25.牛客题解 | ipv4地址白名单_126.牛客题解 | k倍多重正整数集合27.牛客题解 | n个数里出现次数大于等于n除以2的数28.牛客题解 | n个数里最小的k个29.牛客题解 | water30.牛客题解 | xor31.牛客题解 | ん...红茶?32.牛客题解 | 一封奇怪的信33.牛客题解 | 一组带数字编号的球,其中有两个编号只出现了一次,把它们找出来34.牛客题解 | 万万没想到之抓捕孔连顺35.牛客题解 | 万万没想到之聪明的编辑36.牛客题解 | 上台阶37.牛客题解 | 上高楼38.牛客题解 | 下厨房39.牛客题解 | 不想出差的HR40.牛客题解 | 不要二41.牛客题解 | 丢失的三个数42.牛客题解 | 两两配对差值最小43.牛客题解 | 两个子串44.牛客题解 | 两个整数二进制位不同个数45.牛客题解 | 两种排序方法46.牛客题解 | 中位数47.牛客题解 | 中缀表达式转后缀表达式48.牛客题解 | 丰收49.牛客题解 | 串的模式匹配50.牛客题解 | 之字形打印矩阵51.牛客题解 | 乔乔的包52.牛客题解 | 乘坐公交53.牛客题解 | 乘方取模54.牛客题解 | 买房55.牛客题解 | 买橘子56.牛客题解 | 买苹果57.牛客题解 | 买面包58.牛客题解 | 争吵59.牛客题解 | 二分图判定60.牛客题解 | 二分图判定_161.牛客题解 | 二分查找62.牛客题解 | 二叉搜索树判定63.牛客题解 | 二叉树的序列化64.牛客题解 | 二维数组打印65.牛客题解 | 二进制中有多少个166.牛客题解 | 交叉线67.牛客题解 | 交换查询68.牛客题解 | 交错01串69.牛客题解 | 交错序列70.牛客题解 | 代价71.牛客题解 | 任务调度72.牛客题解 | 优雅的点73.牛客题解 | 会话列表74.牛客题解 | 会话列表_175.牛客题解 | 伪正则表达式76.牛客题解 | 俄罗斯方块77.牛客题解 | 保卫方案78.牛客题解 | 保留最大的数79.牛客题解 | 信用卡推荐客户列表80.牛客题解 | 倒水81.牛客题解 | 倒着输出整数82.牛客题解 | 倒置字符串
83.牛客题解 | 公交车
84.牛客题解 | 公平划分85.牛客题解 | 公约数86.牛客题解 | 六一儿童节87.牛客题解 | 共享单车88.牛客题解 | 关灯游戏89.牛客题解 | 冒泡排序90.牛客题解 | 写一段程序判断IP字符串是否属于内网IP题目
解题思路
这是一道使用BFS求解最短路径的问题,主要思路如下:
-
问题分析:
- 个公交站点, 条公交线路
- 每条线路经过若干站点
- 每次乘坐花费1元
- 求从1号站到号站的最少花费
-
解决方案:
- 构建双向图:站点和公交线路都作为节点
- 站点与经过它的公交线路之间建立边
- 使用BFS寻找最短路径
- 最终结果需要除以2(来回算两次)
-
关键点:
- 图的节点包括站点和公交线路
- 一次完整乘车需要两步:上车和下车
- 需要处理无法到达的情况
代码
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
// 建图:n个站点 + m条线路
vector<vector<int>> graph(n + m + 1);
// 读入每条线路经过的站点
for (int i = 1; i <= m; i++) {
int t;
cin >> t;
for (int j = 0; j < t; j++) {
int station;
cin >> station;
// 站点和线路之间建立双向边
graph[station].push_back(n + i);
graph[n + i].push_back(station);
}
}
// BFS求最短路径
vector<int> dist(n + m + 1, -1);
queue<int> q;
q.push(1);
dist[1] = 0;
while (!q.empty()) {
int curr = q.front();
q.pop();
// 遍历相邻节点
for (int next : graph[curr]) {
if (dist[next] == -1) {
dist[next] = dist[curr] + 1;
q.push(next);
}
}
}
// 输出结果
if (dist[n] == -1) {
cout << -1 << endl;
} else {
cout << dist[n] / 2 << endl;
}
return 0;
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
// 建图:n个站点 + m条线路
ArrayList<Integer>[] graph = new ArrayList[n + m + 1];
for (int i = 0; i <= n + m; i++) {
graph[i] = new ArrayList<>();
}
// 读入每条线路经过的站点
for (int i = 1; i <= m; i++) {
int t = sc.nextInt();
for (int j = 0; j < t; j++) {
int station = sc.nextInt();
// 站点和线路之间建立双向边
graph[station].add(n + i);
graph[n + i].add(station);
}
}
// BFS求最短路径
int[] dist = new int[n + m + 1];
Arrays.fill(dist, -1);
Queue<Integer> q = new LinkedList<>();
q.offer(1);
dist[1] = 0;
while (!q.isEmpty()) {
int curr = q.poll();
// 遍历相邻节点
for (int next : graph[curr]) {
if (dist[next] == -1) {
dist[next] = dist[curr] + 1;
q.offer(next);
}
}
}
// 输出结果
if (dist[n] == -1) {
System.out.println(-1);
} else {
System.out.println(dist[n] / 2);
}
}
}
from collections import defaultdict, deque
def solve():
# 读入站点数和线路数
n, m = map(int, input().split())
# 建图:使用邻接表存储
graph = defaultdict(list)
# 读入每条线路经过的站点
for i in range(1, m + 1):
line = list(map(int, input().split()))
t = line[0] # 站点数
stations = line[1:] # 站点列表
# 站点和线路之间建立双向边
for station in stations:
graph[station].append(n + i)
graph[n + i].append(station)
# BFS求最短路径
dist = [-1] * (n + m + 1)
q = deque([1])
dist[1] = 0
while q:
curr = q.popleft()
# 遍历相邻节点
for next_node in graph[curr]:
if dist[next_node] == -1:
dist[next_node] = dist[curr] + 1
q.append(next_node)
# 输出结果
print(-1 if dist[n] == -1 else dist[n] // 2)
# 主程序
if __name__ == "__main__":
solve()
算法及复杂度
- 算法:BFS(广度优先搜索)
- 时间复杂度: - 为站点数, 为边数
- 空间复杂度: - 需要存储图和访问数组
合集:
牛客笔试大厂真题题解1
分类:
牛客笔试大厂真题题解1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端