0分 求助!!! 我也不知道我写的什么算法,但是注释很清楚
查看原帖
0分 求助!!! 我也不知道我写的什么算法,但是注释很清楚
705506
BESTPLAYER楼主2023/2/4 15:58
#include <iostream>
#include <vector>
using namespace std;
//kind是生物种类,num是关系数,ans是最终输出(答案)
int kind, num, ans;
vector<vector<bool>> eat;       //eat[i][j]代表 i 能吃 j
vector<long long> dp;  //记录生物 i 为终的最大食物链数
//函数 getAns 遍历所有动物,存储进 dp 数组中
void getAns(const vector<int> &now)
{
    //next数组存储下一个遍历的生物序号
    vector<int> next;
    //记录已经遍历了的生物序号,防止重复存储进 next 数组
    vector<bool> note(kind, false);
    //记录当前(数组now)遍历,防止重复存储进 next 数组
    for(int i = 0; i < now.size(); i++)
        note[now[i]] = true;
    //目的:循环遍历当前 now 数组,寻找下一层遍历对象
    for(int i = 0; i < now.size(); i++)
    {
        //循环寻找下层遍历对象
        for(int j = 0; j < kind; j++)
        {
            //如果 j 能吃 i
            if(eat[j][now[i]])
            {
                //如果 j 没有被记录过,即防止重复存储 next 数组
                if(!note[j])
                {
                    //存储进 next 数组
                    next.push_back(j);
                    note[j] = true;
                }
                //对下层对象进行加法运算,表示下层 j 的最大食物链数又加上了当前遍历 i 的最大食物链条数
                dp[j] = (dp[j] + dp[now[i]]) % 80112002;
            }
        }
    }
    //若没有下层再可遍历,即已经遍历到最nb的生物那里
    if(next.size() != 0)
        getAns(next);
}
int main()
{
    cin >> kind >> num;
    eat.resize(kind, vector<bool>(kind, false));
    dp.resize(kind, 0);
    //always_be_eaten存储它没有任何动物可吃的动物,即开始遍历对象
    //always_be_eater存储没有任何动物可吃它的动物,即结束遍历对象
    vector<bool> always_be_eaten(kind, true), always_be_eater(kind, true);
    //输入奥
    for(int i = 0; i < num; i++)
    {
        int eaten, eater;
        cin >> eaten >> eater;
        eat[eater - 1][eaten - 1]  = true;
        always_be_eaten[eater - 1] = false;
        always_be_eater[eaten - 1] = false;
    }
    //begin就是开始遍历对象,由于上文always_be_eaten数组是bool存储,所以这里替换成存储下标
    vector<int> begin;
    for(int i = 0; i < kind; i++)
    {
        if(always_be_eaten[i])
        {
            begin.push_back(i);
            //赋予初始值 1
            dp[i] = 1;
        }
    }
    getAns(begin);
    //遍历求出ans
    for(int i = 0; i < kind; i++)
    {
        if(always_be_eater[i])
            ans += dp[i];
    }
    cout << ans << endl;
    return 0;
}
2023/2/4 15:58
加载中...