每天一道leetcode:1466. 重新规划路线(图论&中等&广度优先遍历)

这篇具有很好参考价值的文章主要介绍了每天一道leetcode:1466. 重新规划路线(图论&中等&广度优先遍历)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今日份题目:

n 座城市,从 0n-1 编号,其间共有 n-1 条路线。因此,要想在两座不同城市之间旅行只有唯一一条路线可供选择(路线网形成一颗树)。去年,交通运输部决定重新规划路线,以改变交通拥堵的状况。

路线用 connections 表示,其中 connections[i] = [a, b] 表示从城市 ab 的一条有向路线。

今年,城市 0 将会举办一场大型比赛,很多游客都想前往城市 0 。

请你帮助重新规划路线方向,使每个城市都可以访问城市 0 。返回需要变更方向的最小路线数。

题目数据 保证 每个城市在重新规划路线方向后都能到达城市 0 。

示例1

每天一道leetcode:1466. 重新规划路线(图论&中等&广度优先遍历),图论,leetcode,图论,算法,职场和发展,数据结构,广度优先

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

示例2

每天一道leetcode:1466. 重新规划路线(图论&中等&广度优先遍历),图论,leetcode,图论,算法,职场和发展,数据结构,广度优先

输入: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 * 10^4

  • connections.length == n-1

  • connections[i].length == 2

  • 0 <= connections[i][0], connections[i][1] <= n-1

  • connections[i][0] != connections[i][1]

题目思路

这道题我们使用bfs广度优先遍历。拿例1为例,我们只需要从0开始遍历,由于路径单向通行,故与这些点的连线都需要反向,除此之外,下边那条边直接找是无法从0走过去的,但还有条路需要反向,这时,我们引入反向图,在正向bfs的同时对反向图同样bfs,放入同一个队列中,这样就可以保证图中所有不满足条件的边都被记录下来了。

所谓反向图,就是将图中所有的路径反向,(i,j)处的值与(j,i)处的值交换。

代码

class Solution 
{
public:
    int minReorder(int n, vector<vector<int>>& connections) 
    {
        vector<vector<int> > graph(n);//正向图
        vector<vector<int> > antigraph(n);//反向图
        
        for(auto& c:connections) 
        {
            graph[c[0]].push_back(c[1]);//记录正向图
            antigraph[c[1]].push_back(c[0]);//记录反向图
        }

        int ans=0;
        int visited[100000]={0};
        visited[0]=1;
        queue<int> p;
        p.push(0);
        //bfs
        while(!p.empty()) 
        {
            //获取当前点信息
            int i=p.front();
            p.pop();

            //正向遍历搜寻结果
            for(int j=0;j<graph[i].size();j++)
            {
                if(visited[graph[i][j]]==0) 
                {
                    visited[graph[i][j]]=1;//标记为已到达过
                    ans++;//0向外能到达的点的路径就是需要反向的路径
                    p.push(graph[i][j]);
                }
            }

            //反向遍历搜寻结果
            for(int j=0;j<antigraph[i].size();j++)
            {
                if(visited[antigraph[i][j]]==0) 
                {
                    visited[antigraph[i][j]]=1;//标记为已到达过
                    p.push(antigraph[i][j]);
                } 
            }            
        }
        return ans;
    }
};

提交结果

每天一道leetcode:1466. 重新规划路线(图论&中等&广度优先遍历),图论,leetcode,图论,算法,职场和发展,数据结构,广度优先

 欢迎大家在评论区讨论,如有不懂的代码部分,欢迎在评论区留言!文章来源地址https://www.toymoban.com/news/detail-650104.html

到了这里,关于每天一道leetcode:1466. 重新规划路线(图论&中等&广度优先遍历)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 每天一道leetcode:797. 所有可能的路径(图论&中等&深度优先遍历)

    给你一个有 n 个节点的 有向无环图(DAG) ,请你找出所有从节点 0 到节点 n-1 的路径并输出( 不要求按特定顺序 ) graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j] 存在一条有向边)。 n == graph.length 2 = n = 15 0 = graph[i][j] n graph[i][j] != i (即不存

    2024年02月12日
    浏览(64)
  • 每天一道leetcode:1306. 跳跃游戏 III(图论&中等&广度优先遍历)

    这里有一个非负整数数组 `arr`,你最开始位于该数组的起始下标 `start` 处。当你位于下标 `i` 处时,你可以跳到 `i + arr[i]` 或者 `i - arr[i]`。 请你判断自己是否能够跳到对应元素值为 0 的 **任一** 下标处。 注意,不管是什么情况下,你都无法跳到数组之外。 ``` 输入:arr = [4,

    2024年02月12日
    浏览(35)
  • 每天一道leetcode:1129. 颜色交替的最短路径(图论&中等&广度优先遍历)

    给定一个整数 n ,即有向图中的节点数,其中节点标记为 0 到 n - 1 。图中的每条边为红色或者蓝色,并且可能存在自环或平行边。 给定两个数组 redEdges 和 blueEdges ,其中: redEdges[i] = [ai, bi] 表示图中存在一条从节点 ai 到节点 bi 的红色有向边, blueEdges[j] = [uj, vj] 表示图中存

    2024年02月13日
    浏览(40)
  • 每天一道leetcode:1926. 迷宫中离入口最近的出口(图论&中等&广度优先遍历)

    给你一个 m x n 的迷宫矩阵 maze ( 下标从 0 开始 ),矩阵中有空格子(用 \\\'.\\\' 表示)和墙(用 \\\'+\\\' 表示)。同时给你迷宫的入口 entrance ,用 entrance = [entrancerow, entrancecol] 表示你一开始所在格子的行和列。 每一步操作,你可以往 上 , 下 , 左 或者 右 移动一个格子。你不能进

    2024年02月12日
    浏览(35)
  • 每天一道leetcode:646. 最长数对链(动态规划&中等)

    给你一个由 n 个数对组成的数对数组 pairs ,其中 pairs[i] = [lefti, righti] 且 lefti righti 。 现在,我们定义一种 跟随 关系,当且仅当 b c 时,数对 p2 = [c, d] 才可以跟在 p1 = [a, b] 后面。我们用这种形式来构造 数对链 。 找出并返回能够形成的 最长数对链的长度 。 你不需要用到所

    2024年02月12日
    浏览(46)
  • 每天一道leetcode:516. 最长回文子序列(动态规划&中等)

    给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。 1 = s.length = 1000 s 仅由小写英文字母组成 动态规划 ,使用二维dp数组记录[i,j]间的最大回文子序列长度

    2024年02月13日
    浏览(47)
  • 每天一道leetcode:剑指 Offer 34. 二叉树中和为某一值的路径(中等&图论&深度优先遍历&递归)

    给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 树中节点总数在范围 [0, 5000] 内 -1000 = Node.val = 1000 -1000 = targetSum = 1000 使用递归深度优先遍历,使用前序遍历,在遍历途

    2024年02月12日
    浏览(48)
  • 每天一道leetcode:剑指 Offer 64. 求1+2+…+n(中等&递归)

    求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等及条件判断语句(A?B:C)。 1 = n = 10000 使用递归,我们马上的想法是: 或者: 但是题目要求不能出现if、A?B:C这样的,所以,我们只能直接返回什么东西。返回什么?返回n。只不过n要进行自加

    2024年02月12日
    浏览(50)
  • 每天一道leetcode:剑指 Offer 13. 机器人的运动范围(中等&广度优先遍历&剪枝)

    地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+

    2024年02月13日
    浏览(45)
  • 每天一道leetcode:127. 单词接龙(图论&困难&建图&广度优先遍历)

    字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord - s1 - s2 - ... - sk : 每一对相邻的单词只差一个字母。 对于 1 = i = k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。 sk == endWord 给你两个单词 beginWord 和 endWord 和一个字典

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包