拓扑排序
简要介绍:
拓扑排序通过一个队列来维护,维护入度为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来维护。(注意适当的取模)

浙公网安备 33010602011771号