首页 > 其他 > 详细

P4017 最大食物链计数

时间:2020-07-18 14:07:04      阅读:49      评论:0      收藏:0      [点我收藏+]

最开始看见这道题目的时候,首先想到的是用DFS或BFS试一试,如果用DFS,显然超时妥妥的,BFS的话,由层层递推的关系我们可知,若以某个结点为重点,则最终到该点的食物链总条数num为其所有前驱结点总条数num之和,

然而,BFS显然不行,因为对于某个结点来说,其在食物链中可能占有多个不同级数,只有当这些不同在不同级数上求得的num结果全部得到后,才能将最终结果纳入其后驱结点的num中,这个思路已经很明确了,拓扑排序

题目描述

给你一个食物网,你要求出这个食物网中最大食物链的数量。(这里的“最大食物链”,指的是生物学意义上的食物链,即最左端是不会捕食其他生物的生产者,最右端是不会被其他生物捕食的消费者。)Delia 非常急,所以你只有 1 秒的时间。由于这个结果可能过大,你只需要输出总数模上 80112002 的结果。

输入格式

  • 第一行,两个正整数 n、m,表示生物种类 n 和吃与被吃的关系数 m接下来 m 行,每行两个正整数,表示被吃的生物A和吃A的生物B。

输出格式

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

 

#include<iostream>
#include<queue>
#include<vector>
using namespace std;
int main(){
    int n,m; //n种动物,m条边 
    cin >> n >> m; 
    vector<int> a[n+1];
    int book[n+1] = {0}; //记录入度
        int num[n+1] = {0};
    queue<int>q;
    
    for(int i = 0;i < m;i++){
        int x,y;
        cin >> x >> y;
        a[x].push_back(y);
        book[y]++; 
    } 
    
    for(int i = 1;i <= n;i++){
        if(book[i] == 0){
        q.push(i); 
        num[i] = 1; // 每个生产者代表一条新路径开始
        }

    }
        int aim = 0;//记录最终结果
    while(!q.empty()){
         int x = q.front() ;
         q.pop() ;
       if(a[x].size() == 0){
             aim += num[x];
             if(aim >= 80112002)
                aim %= 80112002; 
        }
        else for(int i = 0;i < a[x].size() ;i++){
              num[a[x][i]] += num[x];
              if( num[a[x][i]] >= 80112002)
                     num[a[x][i]] %= 80112002;
                           //注意num的结果可能会超限制int的限制!
              book[a[x][i]]--;
              if(book[a[x][i]] == 0)
                 q.push(a[x][i]); 
         }
    }


    cout << aim;
    return 0;
}

 

 

 

 

 

 

P4017 最大食物链计数

原文:https://www.cnblogs.com/LISIYUWANG/p/13334948.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!