拓扑排序

简要介绍:
拓扑排序通过一个队列来维护,维护入度为0的顶点,每次将入度为0的点push进队列中,从队列中弹出时,将其邻接的点的入度进行--操作,并判断是否有新的入度为0的点,若有则将该点push进入队列之中,等到队列为空时,看是否还有点未进入,若无,则该图为有向无环图,否则为有向有环图。
拓扑板子:

点击查看代码
 int in[100005]={0};//统计入度
 int out[100005]={0};//统计出度
 vector<int>e[100005];//用于邻接表存储。
 void solve()
 {
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
       int x,y;
       cin>>x>>y;
       e[x].push_back(y);
       in[y]++;
    }
    queue<int>q;
    ll ans=0;
    for(int i=1;i<=n;i++)
    {
        if(in[i]==0)
     {
         dp[i]=1;
         q.push(i);
    }
    }
    while(q.size())
    {
       int t=q.front();
       q.pop();
       for(int i=0;i<e[t].size();i++)
       {
          int v=e[t][i];
          dp[v]=(dp[v]+dp[t])%mo;
          in[v]--;
          out[t]++;
          if(in[v]==0)
            q.push(v);
       }

    }

P4017 最大食物链计数
在进行初始操作时候,统计每个点的入度和出度,出度为0的点则为最高消费者,用于最后统计答案,每个生物的食物链总数通过dp[i]+=dp[j]来统计,j代表i生物所吃的生物。最终答案为,所有最顶级生物的食物链总数之和,用一个变量ans来维护。(注意适当的取模)

posted @ 2024-02-15 00:13  WandW  阅读(21)  评论(0)    收藏  举报