洛谷P4017 最大食物链计数(追加上一篇文章的第二种方法 )

上一篇 不是说 第二种方法RE了吗? 害,其实,是我的问题 我粗心了。------------------------------------------------------

因为

 

 

 

 这两处的循环应该到n而不是m。害 当时写的晕了 脑子没有转过弯 呜呜呜呜呜=======================

这个方法的区别就是开了一个二位数组map[5005][5005] 用于记录关系(相比于上一篇利用h[5005]数组记录 这个方法 开销更大,但是更容易想)

这里就不多赘述了,具体代码如下:

#include<iostream>
#include<queue>
#define N  80112002 
using namespace std;
int map[5005][5005],f[5005],chu[5005],ru[5005];
int n,m,sum;
queue<int> q;
int main(){
    int a,b;
    cin>>n>>m;
    for(int i = 1;i <= m;i++){
        cin>>a>>b;
        map[a][b] = 1;
        chu[a]++;
        ru[b]++;
    }
    for(int j = 1;j <= n;j++){
        if(ru[j] == 0){
            f[j] = 1;
            q.push(j);
        }
    }
    while(!q.empty()){
        int a = q.front();
        q.pop();
        for(int i = 1;i <= n;i++){
            if(map[a][i] == 0) 
                continue;
                f[i] += f[a];
                f[i] %= N;
                ru[i]--;
            if(ru[i] == 0){
                if(chu[i] == 0){
                    sum += f[i];
                    sum %= N;
                    continue;
                }
                else
                    q.push(i);
            }
        }
    }
        cout<<sum<<endl;
        return 0;
    }

okok, 加油小灰灰  这小不能再粗心了 ------------------------------------

posted @ 2023-01-05 15:57  啥都不会的灰太狼  阅读(23)  评论(0)    收藏  举报