当前位置: 首页 > news >正文

【C++BFS】1466. 重新规划路线

本文涉及知识点

C++BFS算法

LeetCode1466. 重新规划路线

n 座城市,从 0 到 n-1 编号,其间共有 n-1 条路线。因此,要想在两座不同城市之间旅行只有唯一一条路线可供选择(路线网形成一颗树)。去年,交通运输部决定重新规划路线,以改变交通拥堵的状况。
路线用 connections 表示,其中 connections[i] = [a, b] 表示从城市 a 到 b 的一条有向路线。
今年,城市 0 将会举办一场大型比赛,很多游客都想前往城市 0 。
请你帮助重新规划路线方向,使每个城市都可以访问城市 0 。返回需要变更方向的最小路线数。
题目数据 保证 每个城市在重新规划路线方向后都能到达城市 0 。

示例 1:

在这里插入图片描述

输入:n = 6, connections = [[0,1],[1,3],[2,3],[4,0],[4,5]]
输出:3
解释:更改以红色显示的路线的方向,使每个城市都可以到达城市 0 。
示例 2:

在这里插入图片描述

输入:n = 5, connections = [[1,0],[1,2],[3,2],[3,4]]
输出:2
解释:更改以红色显示的路线的方向,使每个城市都可以到达城市 0 。
示例 3:

输入:n = 3, connections = [[1,0],[2,0]]
输出:0

提示:

2 <= n <= 5 * 104
connections.length == n-1
connections[i].length == 2
0 <= connections[i][0], connections[i][1] <= n-1
connections[i][0] != connections[i][1]

C++BFS

所有边看成无向边,以0为起点求各节点的层次。枚举各边是否是层次大的指向层次小的。由于没有环,所以任意城市到达0,都是只有一条路径,即层次唯一。
BFS的状态表示:leves[0] = {0},leves[i]记录所有层次为i的城市。
BFS的后续状态:通过next枚举cur的临接点。
BFS的初始状态:leves[0] = {0}
BFS的返回值:无。
BFS的重复处理:leve[i]记录各城市层次,-1表示未处理。

代码

核心代码

class Solution {public:int minReorder(int n, vector<vector<int>>& connections) {vector<vector<int>> neiBo(n);for (const auto& v:connections) {neiBo[v[0]].emplace_back(v[1]);neiBo[v[1]].emplace_back(v[0]);}vector<int> leve(n, -1);queue<int> que;que.emplace(0);leve[0] = 0;while (que.size()) {const auto cur = que.front();que.pop();for (const auto& next : neiBo[cur]) {if (-1 != leve[next]) { continue; }leve[next] = leve[cur] + 1;que.emplace(next);}}int iRet = 0;for (const auto& v : connections) {iRet += (leve[v[0]] < leve[v[1]]);}return iRet;}};

单元测试

int n;vector<vector<int>> connections;TEST_METHOD(TestMethod1){n = 3, connections = { {0,2},{2,1} };auto res = Solution().minReorder(n, connections);AssertEx(2, res);}TEST_METHOD(TestMethod11){n = 6, connections = { {0,1},{1,3},{2,3},{4,0},{4,5} };auto res = Solution().minReorder(n, connections);AssertEx(3, res);}TEST_METHOD(TestMethod12){n = 5, connections = { {1,0},{1,2},{3,2},{3,4} };auto res = Solution().minReorder(n, connections);AssertEx(2, res);}TEST_METHOD(TestMethod13){n = 3, connections = { {1,0},{2,0} };auto res = Solution().minReorder(n, connections);AssertEx(0, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

http://www.lryc.cn/news/412425.html

相关文章:

  • 服务器并发模型
  • Chapter 23 数据可视化——地图
  • Linux笔记 --- 组合数据类型
  • DaoCloud-Dockfile文件NGINX文件
  • 耳机行业中MIC ENC
  • python-自动化办公-Excel-Openpyxl
  • 图形编辑器基于Paper.js教程10:导入导出svg,导入导出json数据
  • [STM32][Bootloader][教程]STM32 HAL库 Bootloader开发和测试教程
  • 如何手写一个SpringBoot框架
  • vite解决前端跨域步骤
  • 同步交互与异步交互:深入解析与选择
  • Day1
  • Introduction to Data Analysis with PySpark
  • 基于双PI控制器结构的六步逆变器供电无刷直流电机调速simulink仿真
  • 双向链表的基本操作
  • modbus tcp和modbusRTU的区别是什么?
  • web小游戏开发:拼图(四)对调和移动拼图玩法的实现
  • 前端:Vue学习 - 智慧商城项目
  • KVM调整虚拟机与CPU铆钉(绑定)关系
  • 华火电焰灶:烹饪新宠,温暖与美味的完美融合
  • 理想发周榜,不是新能源市场的原罪
  • AHK是让任何软件都支持 Shift + 鼠标滚轮 实现界面水平滚动
  • 如何在C语言中实现求解超级丑数
  • secExample靶场之java反序列化漏洞复现
  • 解决升级Linux内核后,open files设置无效的问题。
  • 关于防范勒索病毒Play新变种的风险提示
  • 一款.NET开源、跨平台的DASH/HLS/MSS下载工具
  • MATLAB学习日志DAY21
  • Spingboot请求tcp 方式
  • leetcode刷题日记-括号生成