Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2022-06-03:a -> b,代表a在食物链中被b捕食, 给定一个有向无环图,返回这个图中从最初级动物到最顶级捕食者的食物链有几条。

2022-06-03:a -> b,代表a在食物链中被b捕食, 给定一个有向无环图,返回这个图中从最初级动物到最顶级捕食者的食物链有几条。

原创
作者头像
福大大架构师每日一题
发布于 2022-06-03 13:25:56
发布于 2022-06-03 13:25:56
2510
举报

2022-06-03:a -> b,代表a在食物链中被b捕食,

给定一个有向无环图,返回这个图中从最初级动物到最顶级捕食者的食物链有几条。

来自理想汽车。

答案2022-06-03:

拓扑排序。

代码用rust编写。代码如下:

代码语言:rust
AI代码解释
复制
fn main() {
    let sc: Vec<i32> = vec![5, 7, 1, 2, 1, 3, 2, 3, 3, 5, 2, 5, 4, 5, 3, 4];
    let mut ii: i32 = 0;
    while ii < sc.len() as i32 {
        let mut info = GlobalInfo::new();
        info.n = sc[ii as usize];
        ii += 1;
        let m: i32 = sc[ii as usize];
        ii += 1;
        let mut pre_edge: Vec<i32> = vec![];
        let mut edges_to: Vec<i32> = vec![];
        for _ in 0..m + 1 {
            pre_edge.push(0);
            edges_to.push(0);
        }
        for i in 1..=m {
            let from = sc[ii as usize];
            ii += 1;
            let to = sc[ii as usize];
            ii += 1;
            edges_to[i as usize] = to;
            pre_edge[i as usize] = info.head_edge[from as usize];
            info.head_edge[from as usize] = i;
            info.out0[from as usize] = true;
            info.in0[to as usize] += 1;
        }
        let ans = how_many_ways(&mut pre_edge, &mut edges_to, &mut info);
        println!("ans = {}", ans);
    }
}

pub struct GlobalInfo {
    in0: Vec<i32>,
    out0: Vec<bool>,
    lines: Vec<i32>,
    head_edge: Vec<i32>,
    queue: Vec<i32>,
    mod0: i32,
    n: i32,
}

impl GlobalInfo {
    pub fn new() -> Self {
        let mut in0: Vec<i32> = vec![];
        let mut out0: Vec<bool> = vec![];
        let mut lines: Vec<i32> = vec![];
        let mut head_edge: Vec<i32> = vec![];
        let mut queue: Vec<i32> = vec![];
        let mod0: i32 = 80112002;
        let n: i32 = 0;
        for _i in 0..5001 {
            in0.push(0);
            out0.push(false);
            lines.push(0);
            head_edge.push(0);
            queue.push(0);
        }
        Self {
            in0,
            out0,
            lines,
            head_edge,
            queue,
            mod0,
            n,
        }
    }
}

fn how_many_ways(pre_edge: &mut Vec<i32>, edges_to: &mut Vec<i32>, info: &mut GlobalInfo) -> i32 {
    let mut ql = 0;
    let mut qr = 0;
    for i in 1..info.n {
        if info.in0[i as usize] == 0 {
            info.queue[qr as usize] = i;
            qr += 1;
            info.lines[i as usize] = 1;
        }
    }
    while ql < qr {
        let cur = info.queue[ql];
        ql += 1;
        let mut edge = info.head_edge[cur as usize];
        while edge != 0 {
            let next = edges_to[edge as usize];
            info.lines[next as usize] =
                (info.lines[next as usize] + info.lines[cur as usize]) % info.mod0;
            info.in0[next as usize] -= 1;
            if info.in0[next as usize] == 0 {
                info.queue[qr] = next;
                qr += 1;
            }
            edge = pre_edge[edge as usize];
        }
    }
    let mut ans = 0;
    for i in 1..=info.n {
        if !info.out0[i as usize] {
            ans = (ans + info.lines[i as usize]) % info.mod0;
        }
    }
    return ans;
}

执行结果如下:

在这里插入图片描述
在这里插入图片描述

左神java代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2022-06-25:给定一个正数n, 表示有0~n-1号任务, 给定一个长度为n的数组time,time[i]表示i号任务做完的时间, 给定一个二维数组mat
2022-06-25:给定一个正数n, 表示有0~n-1号任务,给定一个长度为n的数组time,timei表示i号任务做完的时间,给定一个二维数组matrix,matrixj = {a, b} 代表:a任务想要开始,依赖b任务的完成,只要能并行的任务都可以并行,但是任何任务只有依赖的任务完成,才能开始。返回一个长度为n的数组ans,表示每个任务完成的时间。输入可以保证没有循环依赖。来自美团。3.26笔试。答案2022-06-25:拓扑排序基础上做动态规划。代码用rust编写。代码如下:fn main() {
福大大架构师每日一题
2022/06/25
3910
2022-06-25:给定一个正数n, 表示有0~n-1号任务, 给定一个长度为n的数组time,time[i]表示i号任务做完的时间, 给定一个二维数组mat
2022-06-06:大妈一开始手上有x个鸡蛋,她想让手上的鸡蛋数量变成y, 操作1 : 从仓库里拿出1个鸡蛋到手上,x变成x+1个
操作2 : 如果手上的鸡蛋数量是3的整数倍,大妈可以直接把三分之二的鸡蛋放回仓库,手里留下三分之一。
福大大架构师每日一题
2022/06/06
1750
2022-06-06:大妈一开始手上有x个鸡蛋,她想让手上的鸡蛋数量变成y, 操作1 : 从仓库里拿出1个鸡蛋到手上,x变成x+1个
2022-09-27:给定一个棵树, 树上每个节点都有自己的值,记录在数组nums里, 比如nums[4] = 10,表示4号点的值是10, 给定树上的每一条边
请问怎么分割,能让最终的:三个部分中最大的异或值 - 三个部分中最小的异或值,最小。
福大大架构师每日一题
2022/09/27
5160
2022-09-27:给定一个棵树, 树上每个节点都有自己的值,记录在数组nums里, 比如nums[4] = 10,表示4号点的值是10, 给定树上的每一条边
2022-11-04:给定一个正数n,表示有多少个节点 给定一个二维数组edges,表示所有无向边 edges[i] = {a, b} 表示a到b有一条无向边
2022-11-04:给定一个正数n,表示有多少个节点 给定一个二维数组edges,表示所有无向边 edgesi = {a, b} 表示a到b有一条无向边 edges一定表示的是一个无环无向图,也就是树结构 每个节点可以染1、2、3三种颜色。 要求 : 非叶节点的相邻点一定要至少有两种和自己不同颜色的点。 返回一种达标的染色方案,也就是一个数组,表示每个节点的染色状况。 1 <= 节点数量 <= 10的5次方。 来自米哈游。 答案2022-11-04: 生成图,选一个头节点,深度优先染色。 代码用rust编
福大大架构师每日一题
2022/11/04
4580
2022-11-04:给定一个正数n,表示有多少个节点 给定一个二维数组edges,表示所有无向边 edges[i] = {a, b} 表示a到b有一条无向边
2023-09-03:用go编写。给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 给你整数 n 和一个长度为
2023-09-03:用go语言编写。给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1
福大大架构师每日一题
2023/09/04
2220
2023-09-03:用go编写。给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 给你整数 n 和一个长度为
2022-09-05:作为国王的统治者,你有一支巫师军队听你指挥。 :给你一个下标从 0 开始的整数数组 strength , 其中 strength[i] 表
请你返回 所有 巫师组的 总 力量之和。由于答案可能很大,请将答案对 109 + 7 取余 后返回。
福大大架构师每日一题
2022/09/05
2150
2022-09-05:作为国王的统治者,你有一支巫师军队听你指挥。 :给你一个下标从 0 开始的整数数组 strength , 其中 strength[i] 表
2023-03-20:给定一个无向图,保证所有节点连成一棵树,没有环,给定一个正数n为节点数,所以节点编号为0~n-1,那么就一
为了解决此问题,我们可以使用搜索和动态规划技术进行优化,下面将详细介绍两种算法的实现方法。
福大大架构师每日一题
2023/06/08
2920
2023-03-20:给定一个无向图,保证所有节点连成一棵树,没有环,给定一个正数n为节点数,所以节点编号为0~n-1,那么就一
2022-10-23:给你一个整数数组 nums 。如果 nums 的一个子集中, 所有元素的乘积可以表示为一个或多个 互不相同的质数 的乘积,那么我们称它为
2022-10-23:给你一个整数数组 nums 。如果 nums 的一个子集中,
福大大架构师每日一题
2022/10/23
4460
2022-10-23:给你一个整数数组 nums 。如果 nums 的一个子集中, 所有元素的乘积可以表示为一个或多个 互不相同的质数 的乘积,那么我们称它为
2022-10-23:给你一个整数数组 nums 。如果 nums 的一个子集中,所有元素的乘积可以表示为一个或多个 互不相同的
2022-10-23:给你一个整数数组 nums 。如果 nums 的一个子集中,
福大大架构师每日一题
2022/11/06
5190
2022-10-23:给你一个整数数组 nums 。如果 nums 的一个子集中,所有元素的乘积可以表示为一个或多个 互不相同的
2022-06-23:给定一个非负数组,任意选择数字,使累加和最大且为7的倍数,返回最大累加和。 n比较大,10的5次方。 来自美团。3.26笔试。
2022-06-23:给定一个非负数组,任意选择数字,使累加和最大且为7的倍数,返回最大累加和。
福大大架构师每日一题
2022/06/23
2990
2022-06-23:给定一个非负数组,任意选择数字,使累加和最大且为7的倍数,返回最大累加和。 n比较大,10的5次方。 来自美团。3.26笔试。
2022-07-11:给定n位长的数字字符串和正数k,求该子符串能被k整除的子串个数。
2022-07-11:给定n位长的数字字符串和正数k,求该子符串能被k整除的子串个数。
福大大架构师每日一题
2022/07/11
5240
2022-07-11:给定n位长的数字字符串和正数k,求该子符串能被k整除的子串个数。
2023-03-20:给定一个无向图,保证所有节点连成一棵树,没有环, 给定一个正数n为节点数,所以节点编号为0~n-1,那么就一定有n-1条边, 每条边形式为
为了解决此问题,我们可以使用搜索和动态规划技术进行优化,下面将详细介绍两种算法的实现方法。
福大大架构师每日一题
2023/03/20
6830
2023-03-20:给定一个无向图,保证所有节点连成一棵树,没有环, 给定一个正数n为节点数,所以节点编号为0~n-1,那么就一定有n-1条边, 每条边形式为
2023-05-05:给定一个无向、连通的树 树中有 n 个标记为 0...n-1 的节点以及 n-1 条边 。 给定整数 n 和数组 edges , edge
输入: n = 6, edges = [0,1,0,2,2,3,2,4,2,5]。
福大大架构师每日一题
2023/05/05
2630
2023-05-05:给定一个无向、连通的树 树中有 n 个标记为 0...n-1 的节点以及 n-1 条边 。 给定整数 n 和数组 edges , edge
2022-12-22:给定一个数字n,代表数组的长度, 给定一个数字m,代表数组每个位置都可以在1~m之间选择数字, 所有长度为n的数组中,最长递增子序列长度为
2022-12-22:给定一个数字n,代表数组的长度,给定一个数字m,代表数组每个位置都可以在1~m之间选择数字,所有长度为n的数组中,最长递增子序列长度为3的数组,叫做达标数组。返回达标数组的数量。1 <= n <= 500,1 <= m <= 10,500 10 10 * 10,结果对998244353取模,实现的时候没有取模的逻辑,因为非重点。来自微众银行。答案2022-12-22:参考最长递增子序列。代码用rust编写。代码如下:use std::iter::repeat;fn main() {
福大大架构师每日一题
2022/12/22
2.3K0
2022-12-22:给定一个数字n,代表数组的长度, 给定一个数字m,代表数组每个位置都可以在1~m之间选择数字, 所有长度为n的数组中,最长递增子序列长度为
2022-06-09:每个会议给定开始和结束时间, 后面的会议如果跟前面的会议有任何冲突,完全取消冲突的、之前的会议,安排当前的。 给定一个会议数组,返回安排的
2022-06-09:每个会议给定开始和结束时间,后面的会议如果跟前面的会议有任何冲突,完全取消冲突的、之前的会议,安排当前的。给定一个会议数组,返回安排的会议列表。来自通维数码。答案2022-06-09:彻底的流程模拟。线段树。代码用rust编写。代码如下:use rand::Rng;fn main() { let n: i32 = 100; let t: i32 = 5000; let test_time: i32 = 20000; println!("测试开始"); fo
福大大架构师每日一题
2022/06/09
4390
2022-06-09:每个会议给定开始和结束时间, 后面的会议如果跟前面的会议有任何冲突,完全取消冲突的、之前的会议,安排当前的。 给定一个会议数组,返回安排的
2022-07-31:给出一个有n个点,m条有向边的图, 你可以施展魔法,把有向边,变成无向边, 比如A到B的有向边,权重为7。施展魔法之后,A和B通过该边到达
点的数量 <= 10^5,边的数量 <= 2 * 10^5,1 <= 边的权值 <= 10^6。
福大大架构师每日一题
2022/07/31
7710
2022-07-31:给出一个有n个点,m条有向边的图, 你可以施展魔法,把有向边,变成无向边, 比如A到B的有向边,权重为7。施展魔法之后,A和B通过该边到达
2023-01-02:某天,小美在玩一款游戏,游戏开始时,有n台机器, 每台机器都有一个能量水平,分别为a1、a2、…、an, 小美每次操作可以选其中的一台机器
第二行为n个正整数a1, a2,...... an,其中ai表示第i台机器初始的能量水平。
福大大架构师每日一题
2023/01/02
3080
2023-01-02:某天,小美在玩一款游戏,游戏开始时,有n台机器, 每台机器都有一个能量水平,分别为a1、a2、…、an, 小美每次操作可以选其中的一台机器
2023-03-06:给定一个二维网格 grid ,其中: ‘.‘ 代表一个空房间 ‘#‘ 代表一堵 ‘@‘ 是起点 小写字母代表钥匙 大写字母代表锁 我们从起
2023-03-06:给定一个二维网格 grid ,其中:'.' 代表一个空房间'#' 代表一堵'@' 是起点小写字母代表钥匙大写字母代表锁我们从起点开始出发,一次移动是指向四个基本方向之一行走一个单位空间我们不能在网格外面行走,也无法穿过一堵墙如果途经一个钥匙,我们就把它捡起来。除非我们手里有对应的钥匙,否则无法通过锁。假设 k 为 钥匙/锁 的个数,且满足 1 <= k <= 6,字母表中的前 k 个字母在网格中都有自己对应的一个小写和一个大写字母换言之,每个锁有唯一对应的钥匙,每个钥匙也有唯一对应的锁
福大大架构师每日一题
2023/03/06
3930
2023-03-06:给定一个二维网格 grid ,其中: ‘.‘ 代表一个空房间 ‘#‘ 代表一堵 ‘@‘ 是起点 小写字母代表钥匙 大写字母代表锁 我们从起
2022-06-20:一个二维矩阵,上面只有 0 和 1,只能上下左右移动, 如果移动前后的元素值相同,则耗费 1 ,否则耗费 2。 问从左上到右下的最小耗费。
1.网上非常流行的方法,但这是错误的。这道题动态规划是做不了的。因为上下左右四个方向都可能走,而不是右下两个方向。
福大大架构师每日一题
2022/06/20
7070
2022-06-20:一个二维矩阵,上面只有 0 和 1,只能上下左右移动, 如果移动前后的元素值相同,则耗费 1 ,否则耗费 2。 问从左上到右下的最小耗费。
2022-06-29:x = { a, b, c, d },y = { e, f, g, h },x、y两个小数组长度都是4。如
[左神java代码](https://github.com/algorithmzuo/weekly-problems/blob/main/src/class_2022_04_2_week/Code06_PerfectPairNumber.java)
福大大架构师每日一题
2023/06/08
2560
2022-06-29:x = { a, b, c, d },y = { e, f, g, h },x、y两个小数组长度都是4。如
推荐阅读
2022-06-25:给定一个正数n, 表示有0~n-1号任务, 给定一个长度为n的数组time,time[i]表示i号任务做完的时间, 给定一个二维数组mat
3910
2022-06-06:大妈一开始手上有x个鸡蛋,她想让手上的鸡蛋数量变成y, 操作1 : 从仓库里拿出1个鸡蛋到手上,x变成x+1个
1750
2022-09-27:给定一个棵树, 树上每个节点都有自己的值,记录在数组nums里, 比如nums[4] = 10,表示4号点的值是10, 给定树上的每一条边
5160
2022-11-04:给定一个正数n,表示有多少个节点 给定一个二维数组edges,表示所有无向边 edges[i] = {a, b} 表示a到b有一条无向边
4580
2023-09-03:用go编写。给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 给你整数 n 和一个长度为
2220
2022-09-05:作为国王的统治者,你有一支巫师军队听你指挥。 :给你一个下标从 0 开始的整数数组 strength , 其中 strength[i] 表
2150
2023-03-20:给定一个无向图,保证所有节点连成一棵树,没有环,给定一个正数n为节点数,所以节点编号为0~n-1,那么就一
2920
2022-10-23:给你一个整数数组 nums 。如果 nums 的一个子集中, 所有元素的乘积可以表示为一个或多个 互不相同的质数 的乘积,那么我们称它为
4460
2022-10-23:给你一个整数数组 nums 。如果 nums 的一个子集中,所有元素的乘积可以表示为一个或多个 互不相同的
5190
2022-06-23:给定一个非负数组,任意选择数字,使累加和最大且为7的倍数,返回最大累加和。 n比较大,10的5次方。 来自美团。3.26笔试。
2990
2022-07-11:给定n位长的数字字符串和正数k,求该子符串能被k整除的子串个数。
5240
2023-03-20:给定一个无向图,保证所有节点连成一棵树,没有环, 给定一个正数n为节点数,所以节点编号为0~n-1,那么就一定有n-1条边, 每条边形式为
6830
2023-05-05:给定一个无向、连通的树 树中有 n 个标记为 0...n-1 的节点以及 n-1 条边 。 给定整数 n 和数组 edges , edge
2630
2022-12-22:给定一个数字n,代表数组的长度, 给定一个数字m,代表数组每个位置都可以在1~m之间选择数字, 所有长度为n的数组中,最长递增子序列长度为
2.3K0
2022-06-09:每个会议给定开始和结束时间, 后面的会议如果跟前面的会议有任何冲突,完全取消冲突的、之前的会议,安排当前的。 给定一个会议数组,返回安排的
4390
2022-07-31:给出一个有n个点,m条有向边的图, 你可以施展魔法,把有向边,变成无向边, 比如A到B的有向边,权重为7。施展魔法之后,A和B通过该边到达
7710
2023-01-02:某天,小美在玩一款游戏,游戏开始时,有n台机器, 每台机器都有一个能量水平,分别为a1、a2、…、an, 小美每次操作可以选其中的一台机器
3080
2023-03-06:给定一个二维网格 grid ,其中: ‘.‘ 代表一个空房间 ‘#‘ 代表一堵 ‘@‘ 是起点 小写字母代表钥匙 大写字母代表锁 我们从起
3930
2022-06-20:一个二维矩阵,上面只有 0 和 1,只能上下左右移动, 如果移动前后的元素值相同,则耗费 1 ,否则耗费 2。 问从左上到右下的最小耗费。
7070
2022-06-29:x = { a, b, c, d },y = { e, f, g, h },x、y两个小数组长度都是4。如
2560
相关推荐
2022-06-25:给定一个正数n, 表示有0~n-1号任务, 给定一个长度为n的数组time,time[i]表示i号任务做完的时间, 给定一个二维数组mat
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档