前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2022-06-03:a -> b,代表a在食物链中被b捕食,给定一个有向无环图,返回这个图中从最初级动物到最顶级捕食者的食物链

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

作者头像
福大大架构师每日一题
发布2023-06-08 14:20:59
1030
发布2023-06-08 14:20:59
举报

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

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

来自理想汽车。

答案2022-06-03:

拓扑排序。

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

代码语言:javascript
复制
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代码](https://github.com/algorithmzuo/weekly-problems/blob/main/src/class_2022_03_4_week/Code05_HowManyWaysFromBottomToTop.java)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

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

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档