题目
分析
思路:拓扑排序。当一个点的入度变为零,所有它能吃的东西都已经搜索过了,这时它的数值就不会发生变化,就可以入队了,这样也保证了队列里的所有数值都不会发生变化。
AC代码
#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
int n, m, ans;
int in[5005], out[5005], total[5005];
int edge[5005][5005];
queue<int> q;
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++)
{
int u, v;
scanf("%d%d", &u, &v);
edge[u][v] = 1;
out[u]++;
in[v]++;
}
for (int i = 1; i <= n; i++)
{
if (in[i] == 0)
{
total[i] = 1;
q.push(i);
}
}
while (!q.empty())
{
int t = q.front();
q.pop();
for (int i = 1; i <= n; i++)
{
if (edge[t][i] == 0) continue;
total[i] = (total[t] + total[i]) % 80112002;
in[i]--;
if (in[i] == 0)
{
if (out[i] == 0)
{
ans = (ans + total[i]) % 80112002;
}
q.push(i);
}
}
}
printf("%d", ans);
}