2 条题解

  • 2
    @ 2026-5-26 21:22:41

    每种生物作为顶端所拥有的食物链数量是所有它捕食的生物所拥有的食物链的数量。 只有当它捕食的所有生物的答案都被统计,它的答案才是确定的。只有答案确定的生物才会被压入bfs中对其他生物的答案进行贡献。 最开始已确定的生物是最低级的生产者,贡献为1。 题目答案即为所有最高级捕食者处答案相加,注意单独孤立的生物不能算一条食物链。

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 1e5 + 10;
    vector<int> G[N];//邻接表建图
    int f[N]/*表示以f为终点的食物链有几条*/, 
        din[N]/*入度,入度为零即生产者*/,
        dout[N]/*出度, 出度为零即最高级消费者*/,
        din1[N]/*备份出度,单个生物不算食物链*/;
    
    int main()
    {
        int n, m; cin >> n >> m;
        for (int i = 1; i <= m; i++)
        {
            int x, y; cin >> x >> y;
            G[x].push_back(y);//能量从x传递向y
            din[y] ++; dout[x]++;
        }
        memcpy(din1, din, sizeof din);//备份入度
    
        queue<int> q;//bfs进行dp
        for (int i = 1; i <= n; i++)
            if (din[i] == 0) q.push(i), f[i] = 1;//生产者压入队列
        while (!q.empty())
        {
            int x = q.front(); q.pop();//取队头bfs
            for (int y : G[x])
            {
                f[y] += f[x];//对y生物的答案贡献
                din[y]--;//能对y贡献的生物少了一种
                if (din[y] == 0)//y不会再被贡献了,答案已经确定
                    q.push(y);//只有答案已经确定的生物才能被压入队列
            }
        }
        int ans = 0;
        for (int i = 1; i <= n; i++)
            if (dout[i] == 0 and din1[i] != 0)
                /*统计最高级消费者处的答案,且单独的一种孤立生物不算一条食物链*/
                ans += f[i];
        cout << ans;
        return 0;
    }
    /*尘埃,已然落定*/
    /*至此,一锤定音*/
    
    • 0
      @ 2025-10-8 17:10:47

      qkw:

      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e5+10;
      vector<int>G[N];
      int f[N],rd[N],cd[N],rrd[N];
      int main()
      {
          int n,m;scanf("%d%d",&n,&m);
          for(int i=1;i<=m;i++)
          {
              int x,y;scanf("%d%d",&x,&y);
              G[x].push_back(y);
              rd[y]++;cd[x]++;
          }
          deque<int>q;memcpy(rrd,rd,sizeof(rd));
          for(int i=1;i<=n;i++)if(rd[i]==0)q.push_back(i),f[i]=1;
          while(!q.empty())
          {
              int x=q.front();q.pop_front();
              for(int y:G[x])
              {
                  f[y]+=f[x];
                  rd[y]--;
                  if(rd[y]==0)q.push_back(y);
              }
          } 
          int ans=0;for(int i=1;i<=n;i++)if(cd[i]==0&&rrd[i]!=0)ans+=f[i];
          printf("%d",ans);
          return 0;
      }
      
      • 1

      信息

      ID
      6227
      时间
      1000ms
      内存
      128MiB
      难度
      7
      标签
      递交数
      113
      已通过
      23
      上传者