洛谷 最大食物链计数 python题解

题目:P4017 最大食物链计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

给你一个食物网,你要求出这个食物网中最大食物链的数量。

(这里的“最大食物链”,指的是生物学意义上的食物链,即最左端是不会捕食其他生物的生产者,最右端是不会被其他生物捕食的消费者。)

Delia 非常急,所以你只有 1 秒的时间。

由于这个结果可能过大,你只需要输出总数模上 80112002 的结果。

输入格式

第一行,两个正整数 n、m,表示生物种类 n 和吃与被吃的关系数 m。

接下来 m 行,每行两个正整数,表示被吃的生物A和吃A的生物B。

输出格式

一行一个整数,为最大食物链数量模上 8011200280112002 的结果。

题目分析:

        记 s[ i ] 为:到达节点 i 的食物链的个数。我们可以知道s【i】 = sum(所有被节点 i 吃的节点)。以这个条件我们可以写出以下代码。用字典记录,每个节点的入度,出度,指向的节点名与食物链的条数。

        我们知道入度为零的点就表示他是生产者。生产者的食物链数记为一(这样才能加出数据)。这个节点用完后就将其指向的节点的入度减一。判断入度是否为零。为零则加入队列。

        代码如下:

n, m = map(int, input().split(' '))
mem = dict()
for i in range(1, n + 1):
    mem[i] = [0, 0, [], 0]  # 入, 出, 出点. 食物链条数
b = [i for i in range(1, n + 1)]  # 生产者列表
e = [i for i in range(1, n + 1)]  # 最终消费者列表


for i in range(m):  # 数据输入
    prey, predator = map(int, input().split(' '))
    if prey in e:    # 如果最终消费者中的数据是猎物那就删掉
        e.remove(prey)
    if predator in b: # 如果初始生产者中的数据是消费者那就删掉 
        b.remove(predator)
    mem[prey][1] += 1
    mem[prey][2].append(predator)
    mem[predator][0] += 1

for i in b:
    mem[i][3] += 1 # 初始生产着食物链条数加一

while b:   # 遍历初始生产者列表
    step = b.pop() 
    if mem[step][1] == 0:  # 如果是最终消费者就不计算
        continue
    for i in mem[step][2]: # 否则给他指向的点都加上 本节点的食物链条数,且入度减一
        mem[i][3] += mem[step][3]  
        mem[i][0] -= 1
        mem[i][3] = mem[i][3] % 80112002  # 这里按要求mod一开始我忘了,只通过了20%
        if mem[i][0] == 0:
            b.append(i)  #如果入度为零就添加进队列

ans = sum([mem[i][3] for i in e])% 80112002  # 求和取模
print(ans)

         此代码只是进行了简单的模拟,无法通过所有的节点(最后两个测试点超时)。让我们分析一下哪部分的代码可以优化一下。

        

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值